在 5.0 后 google 推出了用于替代 ListView 的新控件 --- RecyclerView。
至于这么用,在这就不多说了,资料很多。 这里我们主要来看看关于 RecyclerAdapter 的封装 。
RecyclerView 确实很好用,灵活自由,但是也因此代码量相对 ListView 会比较多。并且没有现成的 Adapter 使用 ,就算是显示简单的文本列表,也需要重写。那么为了方便使用。我们可以对 RecyclerAdapter 进行简单的封装。在此基础上,可以根据个人项目需求进行更多复杂的封装。
来看代码吧
public abstract class BaseRecyclerAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
protected List<T> mDatas = new ArrayList<>();
protected Context mContext;
protected LayoutInflater inflater;
AdapterView.OnItemClickListener mItemClickListener;
public BaseRecyclerAdapter(List<T> mDatas, Context mContext) {
this.mDatas = mDatas;
this.mContext = mContext;
inflater = LayoutInflater.from(mContext);
}
@Override
public void onBindViewHolder(VH holder, int position) {
T item = getItem(position);
bindItemData(holder, item, position);
setupOnItemClick(holder, position);
}
protected abstract void bindItemData(VH viewHolder, T data, int position);
protected void setupOnItemClick(final VH viewHolder, final int position) {
if (mItemClickListener != null) {
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mItemClickListener.onItemClick(null, viewHolder.itemView, position, position);
}
});
}
}
@Override
public int getItemCount() {
return mDatas.size();
}
public T getItem(int position) {
position = Math.max(0, position);
return mDatas.get(position);
}
public List<T> getDataSource() {
return mDatas;
}
public void addData(List<T> newItems) {
if (newItems != null) {
mDatas.addAll(newItems);
notifyDataSetChanged();
}
}
public void deleteItem(int position) {
mDatas.remove(position);
notifyItemRemoved(position);
notifyDataSetChanged();
}
public void updateListViewData(List<T> lists) {
mDatas.clear();
if (lists != null) {
mDatas.addAll(lists);
notifyDataSetChanged();
}
}
public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
this.mItemClickListener = listener;
}
}
上面的代码中对数据的获取,添加,删除,替换等操作进行了封装。还有点击事件,默认的 RecyclerAdapter 是不管点击事件的,需要我们自己去做接口。当然了,也可以直接写在 Adapter 里面,不过耦合性不是太好。
网友评论