前言
自从RecyclerVIew
出来后就尝试着用它,效果真的是比ListView
好多了。
但是发现了一个问题,由于RecyclerView
的Adapter
必须继承自RecyclerView.Adapter
,并且指定我们写的ViewHolder
为泛型,为了达到万能的效果,我们把需要传入的Java Bean
属性直接用一个泛型T
指代,我们都在不停的重复写这几个方法①,为何不像之前ListView
一样,封装一下呢?
- getItemViewType(int position)
- getItemCount()
- onCreateViewHolder(ViewGroup parent, int viewType)
- onBindViewHolder(RecyclerView.ViewHolder holder, int position)
- 以及定义一个单击事件的接口 OnItemClickListener
那么还有一个问题,为了给用户一个友好的提示,加载更多该怎么做呢。下面带你来封装一下RecyclerView.Adapter
,先看看效果图:
使用方法
先看一下封装后的 BaseRecyclerViewAdapter 代码
BaseRecyclerViewAdapter
public abstract class BaseRecyclerViewAdapter<T>
extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int TYPE_ITEM = 0;
public static final int TYPE_FOOTER = 1;
private int mItemLayoutRes = -1;
protected Context mContext;
protected List<T> mList = new ArrayList<>();
protected OnItemClickListener<T> mOnItemClickListener;
protected OnReloadClickListener mOnReloadClickListener;
private FooterViewHolder mFooterViewHolder;
public BaseRecyclerViewAdapter(Context context, @LayoutRes int itemLayoutRes) {
this.mContext = context;
this.mItemLayoutRes = itemLayoutRes;
}
public void setOnItemClickListener(OnItemClickListener<T> onItemClickListener) {
mOnItemClickListener = onItemClickListener;
}
public void setOnReloadClickListener(OnReloadClickListener onReloadClickListener) {
this.mOnReloadClickListener = onReloadClickListener;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_FOOTER) {
View view = getView(parent, R.layout.rv_item_footer);
return mFooterViewHolder = new FooterViewHolder(view);
} else {
View view = getView(parent, mItemLayoutRes);
final BaseViewHolder baseViewHolder = new BaseViewHolder(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mOnItemClickListener != null) {
int position = baseViewHolder.getLayoutPosition();
mOnItemClickListener.onItemClick(view, mList.get(position));
}
}
});
return baseViewHolder;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof BaseViewHolder && mList.size() != 0 && mList.size() != position) {
BaseViewHolder viewHolder = (BaseViewHolder) holder;
onBindViewHolder(