Skip to content

Instantly share code, notes, and snippets.

@tysheng
Last active March 9, 2017 08:17
Show Gist options
  • Save tysheng/fee8066031b0f62c39d827f18af0ae07 to your computer and use it in GitHub Desktop.
Save tysheng/fee8066031b0f62c39d827f18af0ae07 to your computer and use it in GitHub Desktop.
Base adapter for BaseQuickAdapter(version 2.8.0)
/**
* 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;
}
}
}
@tysheng
Copy link
Author

tysheng commented Dec 6, 2016

setListener() in convert() method, setOnItemClickListener() in your activity/fragment

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment