Last active
March 9, 2017 08:17
-
-
Save tysheng/fee8066031b0f62c39d827f18af0ae07 to your computer and use it in GitHub Desktop.
Base adapter for BaseQuickAdapter(version 2.8.0)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Base adapter for BaseQuickAdapter | |
* Attention: all method called after setAdapter(). | |
* Created by tysheng | |
* Date: 16/9/18 09:18. | |
* Email: tyshengsx@gmail.com | |
*/ | |
public abstract class BaseRecyclerViewAdapter<T> extends BaseQuickAdapter<T, StyBaseViewHolder> { | |
protected RecyclerView mRecyclerView; | |
private OnItemClickListener mOnItemClickListener; | |
private Boolean showPic; | |
public BaseRecyclerViewAdapter(int layoutResId, List<T> data) { | |
super(layoutResId, data); | |
} | |
public BaseRecyclerViewAdapter(List<T> data) { | |
super(data); | |
} | |
protected boolean isShowPic() { | |
if (showPic == null) { | |
showPic = Util.isShowPic(); | |
} | |
return showPic; | |
} | |
@Override | |
protected StyBaseViewHolder createBaseViewHolder(View view) { | |
return new StyBaseViewHolder(view); | |
} | |
public void onEmptyView(ViewGroup parent) { | |
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout_loading, parent, false); | |
setEmptyView(v); | |
} | |
/** | |
* Description: | |
* Creator: shengtianyang | |
* Update Date: 2017/3/3 11:29 | |
*/ | |
public void onEmptyView() { | |
checkNotNull(); | |
View v = LayoutInflater.from(mRecyclerView.getContext()).inflate(R.layout.item_layout_loading, mRecyclerView, false); | |
setEmptyView(v); | |
} | |
/** | |
* @param runnable | |
*/ | |
public void onLoadPost(final Runnable runnable) { | |
checkNotNull(); | |
onLoad(new BaseQuickAdapter.RequestLoadMoreListener() { | |
@Override | |
public void onLoadMoreRequested() { | |
mRecyclerView.post(runnable); | |
} | |
}); | |
} | |
private void checkNotNull() { | |
if (mRecyclerView == null) { | |
throw new RuntimeException("please bind recyclerView first!"); | |
} | |
} | |
public void setPoolCount(int type, int count) { | |
checkNotNull(); | |
RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool(); | |
mRecyclerView.setRecycledViewPool(viewPool); | |
viewPool.setMaxRecycledViews(type, count); | |
} | |
public void onLoad(BaseQuickAdapter.RequestLoadMoreListener listener) { | |
setLoadMoreView(new LoadView()); | |
setOnLoadMoreListener(listener); | |
} | |
public void onLoad(int size, BaseQuickAdapter.RequestLoadMoreListener listener) { | |
setAutoLoadMoreSize(size); | |
onLoad(listener); | |
} | |
public void onEnd() { | |
loadMoreEnd(); | |
} | |
public void setData(List<T> data, boolean enable) { | |
setNewData(data); | |
if (!enable) { | |
setEnableLoadMore(false); | |
} else { | |
loadMoreComplete(); | |
} | |
} | |
@Override | |
public void setNewData(List<T> data) { | |
super.setNewData(data); | |
showPic = Util.isShowPic(); | |
} | |
/** | |
* override the method, unEnable load more after the first time setData. | |
* | |
* @param data | |
*/ | |
public void setData(List<T> data) { | |
setData(data, false); | |
} | |
public boolean isEmpty() { | |
return ListUtil.isEmpty(mData); | |
} | |
/** | |
* auto call loadMoreComplete() after addData(). | |
* | |
* @param newData | |
*/ | |
@Override | |
public void addData(List<T> newData) { | |
super.addData(newData); | |
loadMoreComplete(); | |
} | |
/** | |
* when remove all items , show empty view | |
* | |
* @param position | |
*/ | |
@Override | |
public void remove(int position) { | |
super.remove(position); | |
if (ListUtil.isEmpty(mData)) | |
onEmpty(); | |
} | |
/** | |
* remove data between from and to, [min,max) | |
* | |
* @param from pos | |
* @param count count | |
*/ | |
public void remove(int from, int count) { | |
for (int i = 0; i < count; i++) { | |
mData.remove(from); | |
} | |
notifyItemRangeRemoved(from + getHeaderLayoutCount(), count); | |
if (ListUtil.isEmpty(mData)) | |
onEmpty(); | |
} | |
/** | |
* update single item | |
* | |
* @param pos click position | |
*/ | |
public void updateSingleItem(int pos) { | |
notifyItemChanged(pos + getHeaderLayoutCount()); | |
} | |
/** | |
* Description: | |
* Creator: shengtianyang | |
* Update Date: 2017/3/3 11:29 | |
*/ | |
public void bindToRecyclerView(RecyclerView recyclerView) { | |
if (mRecyclerView != null) { | |
throw new RuntimeException("Don't bind twice"); | |
} | |
mRecyclerView = recyclerView; | |
recyclerView.setAdapter(this); | |
} | |
/** | |
* Description: | |
* Creator: shengtianyang | |
* Update Date: 2017/3/3 11:29 | |
*/ | |
public View getViewByPosition(int pos, int id) { | |
return getViewByPosition(mRecyclerView, pos, id); | |
} | |
public View getViewByPosition(RecyclerView recyclerView, int pos, int id) { | |
if (recyclerView == null) { | |
return null; | |
} | |
BaseViewHolder viewHolder = (BaseViewHolder) recyclerView.findViewHolderForLayoutPosition(pos); | |
return viewHolder.getView(id); | |
} | |
/** | |
* Description: | |
* Creator: shengtianyang | |
* Update Date: 2017/3/3 11:29 | |
*/ | |
public void checkFullPage() { | |
checkFullPage(mRecyclerView); | |
} | |
/** | |
* check if full page after setNewData, if full, it will open load more again. | |
* | |
* @param recyclerView your recyclerView | |
* @see #setNewData(List) | |
*/ | |
public void checkFullPage(RecyclerView recyclerView) { | |
if (recyclerView == null) return; | |
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); | |
if (manager == null) return; | |
if (manager instanceof LinearLayoutManager) { | |
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) manager; | |
recyclerView.postDelayed(new Runnable() { | |
@Override | |
public void run() { | |
if ((linearLayoutManager.findLastCompletelyVisibleItemPosition() + 1) != getItemCount()) { | |
setEnableLoadMore(true); | |
} | |
} | |
}, 50); | |
} else if (manager instanceof StaggeredGridLayoutManager) { | |
final StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) manager; | |
recyclerView.postDelayed(new Runnable() { | |
@Override | |
public void run() { | |
final int[] positions = new int[2]; | |
staggeredGridLayoutManager.findLastCompletelyVisibleItemPositions(positions); | |
int pos = Math.max(positions[0], positions[1]) + 1; | |
if (pos != getItemCount()) { | |
setEnableLoadMore(true); | |
} | |
} | |
}, 50); | |
} | |
} | |
public void onEmpty() { | |
loadMoreComplete(); | |
setNewData(null); | |
View view = getEmptyView(); | |
if (view != null) { | |
view.setVisibility(View.VISIBLE); | |
TextView textView = (TextView) view.findViewById(R.id.textView); | |
textView.setText("没有数据哦"); | |
view.findViewById(R.id.progressBar).setVisibility(View.GONE); | |
} | |
} | |
public void onError() { | |
loadMoreFail(); | |
} | |
/** | |
* clickListener | |
*/ | |
public void setOnItemClickListener(OnItemClickListener onItemClickListener) { | |
this.mOnItemClickListener = onItemClickListener; | |
} | |
private boolean isEnabled(int viewType) { | |
switch (viewType) { | |
case HEADER_VIEW: | |
case LOADING_VIEW: | |
case FOOTER_VIEW: | |
case EMPTY_VIEW: | |
return false; | |
default: | |
return true; | |
} | |
} | |
/** | |
* 点击事件 | |
* | |
* @param holder ViewHolder | |
* @param shouldAddOnItemView 是否给item view 增加点击 | |
* @param ids 子view的 id数组 | |
*/ | |
protected void setClickListeners(final StyBaseViewHolder holder, boolean shouldAddOnItemView, int... ids) { | |
if (ids != null && ids.length != 0) { | |
for (int id : ids) { | |
setChildListener(holder, id, false); | |
} | |
} | |
if (shouldAddOnItemView) { | |
setListener(holder); | |
} | |
} | |
/** | |
* 长按点击事件 | |
* | |
* @param holder ViewHolder | |
* @param shouldAddOnItemView 是否给item view 增加点击 | |
* @param ids 子view的 id数组 | |
*/ | |
protected void setLongClickListeners(final StyBaseViewHolder holder, boolean shouldAddOnItemView, int... ids) { | |
if (ids != null && ids.length != 0) { | |
for (int id : ids) { | |
setLongClickListener(holder, false, id); | |
} | |
} | |
if (shouldAddOnItemView) { | |
setLongClickListener(holder, true, 0); | |
} | |
} | |
private void setLongClickListener(final StyBaseViewHolder viewHolder, boolean isItemView, int id) { | |
if (!isEnabled(viewHolder.getItemViewType())) return; | |
View view; | |
if (isItemView) { | |
view = viewHolder.getConvertView(); | |
} else { | |
view = viewHolder.getView(id); | |
} | |
view.setOnLongClickListener(new View.OnLongClickListener() { | |
@Override | |
public boolean onLongClick(View v) { | |
if (mOnItemClickListener != null) { | |
int position = viewHolder.getLayoutPosition() - getHeaderLayoutCount(); | |
return mOnItemClickListener.onItemLongClick(v, position); | |
} | |
return false; | |
} | |
}); | |
} | |
/** | |
* only for the whole item | |
* <p> | |
* user in convert() | |
* | |
* @param viewHolder viewHolder | |
* @see #convert(BaseViewHolder, Object) | |
*/ | |
protected void setListener(final StyBaseViewHolder viewHolder) { | |
setListener(viewHolder, false); | |
} | |
protected void setListener(final StyBaseViewHolder viewHolder, boolean setLong) { | |
if (!isEnabled(viewHolder.getItemViewType())) return; | |
viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View v) { | |
if (mOnItemClickListener != null) { | |
int position = viewHolder.getLayoutPosition() - getHeaderLayoutCount(); | |
mOnItemClickListener.onItemClick(v, position); | |
} | |
} | |
}); | |
if (!setLong) return; | |
viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() { | |
@Override | |
public boolean onLongClick(View v) { | |
if (mOnItemClickListener != null) { | |
int position = viewHolder.getLayoutPosition() - getHeaderLayoutCount(); | |
return mOnItemClickListener.onItemLongClick(v, position); | |
} | |
return false; | |
} | |
}); | |
} | |
/** | |
* for child and whole item, notice: better to give an id to root view, and consider it a child view. | |
* <p> | |
* user in convert() | |
* | |
* @param viewHolder holder | |
* @param ids one or more | |
* @see #convert(BaseViewHolder, Object) | |
*/ | |
protected void setChildListener(final StyBaseViewHolder viewHolder, int... ids) { | |
for (int id : ids) { | |
setChildListener(viewHolder, id, false); | |
} | |
} | |
protected void setChildListener(final StyBaseViewHolder viewHolder, int id, boolean setLong) { | |
if (!isEnabled(viewHolder.getItemViewType())) return; | |
View view = viewHolder.getView(id); | |
view.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View v) { | |
if (mOnItemClickListener != null) { | |
int position = viewHolder.getLayoutPosition() - getHeaderLayoutCount(); | |
mOnItemClickListener.onItemClick(v, position); | |
} | |
} | |
}); | |
if (!setLong) return; | |
view.setOnLongClickListener(new View.OnLongClickListener() { | |
@Override | |
public boolean onLongClick(View v) { | |
if (mOnItemClickListener != null) { | |
int position = viewHolder.getLayoutPosition() - getHeaderLayoutCount(); | |
return mOnItemClickListener.onItemLongClick(v, position); | |
} | |
return false; | |
} | |
}); | |
} | |
/** | |
* Description: | |
* Creator: shengtianyang | |
* Update Date: 2017/3/3 11:31 | |
*/ | |
public void addOnItemTouchListener(RecyclerView.OnItemTouchListener listener) { | |
checkNotNull(); | |
mRecyclerView.addOnItemTouchListener(listener); | |
} | |
public interface OnItemClickListener { | |
void onItemClick(View view, int position); | |
boolean onItemLongClick(View view, int position); | |
} | |
private static class LoadView extends LoadMoreView { | |
@Override | |
public int getLayoutId() { | |
return R.layout.item_recycler_loading_more_new; | |
} | |
@Override | |
protected int getLoadingViewId() { | |
return R.id.progressBar; | |
} | |
@Override | |
protected int getLoadFailViewId() { | |
return R.id.error; | |
} | |
@Override | |
protected int getLoadEndViewId() { | |
return R.id.end; | |
} | |
@Override | |
public void convert(BaseViewHolder holder) { | |
super.convert(holder); | |
ImageView img = holder.getView(R.id.progressBar); | |
AnimationDrawable drawable = (AnimationDrawable) img.getDrawable(); | |
switch (getLoadMoreStatus()) { | |
case LoadMoreView.STATUS_LOADING: | |
//start animation | |
if (drawable != null && !drawable.isRunning()) { | |
drawable.start(); | |
} | |
break; | |
case LoadMoreView.STATUS_DEFAULT: | |
default: | |
//stop animation | |
if (drawable != null && drawable.isRunning()) { | |
drawable.stop(); | |
} | |
break; | |
} | |
} | |
} | |
public static class SimpleItemClickListener implements OnItemClickListener { | |
@Override | |
public void onItemClick(View view, int position) { | |
} | |
@Override | |
public boolean onItemLongClick(View view, int position) { | |
return false; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
setListener()
inconvert()
method,setOnItemClickListener()
in your activity/fragment