在 5.0 后 google 推出了用于替代 ListView 的新控件 --- RecyclerView。
至于這么用,在這就不多說了,資料很多。 這里我們主要來看看關(guān)于 RecyclerAdapter 的封裝 。
RecyclerView 確實(shí)很好用,靈活自由,但是也因此代碼量相對 ListView 會(huì)比較多。并且沒有現(xiàn)成的 Adapter 使用 ,就算是顯示簡單的文本列表,也需要重寫。那么為了方便使用。我們可以對 RecyclerAdapter 進(jìn)行簡單的封裝。在此基礎(chǔ)上,可以根據(jù)個(gè)人項(xiàng)目需求進(jìn)行更多復(fù)雜的封裝。
來看代碼吧
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;
}
}
上面的代碼中對數(shù)據(jù)的獲取,添加,刪除,替換等操作進(jìn)行了封裝。還有點(diǎn)擊事件,默認(rèn)的 RecyclerAdapter 是不管點(diǎn)擊事件的,需要我們自己去做接口。當(dāng)然了,也可以直接寫在 Adapter 里面,不過耦合性不是太好。