Bootstrap

半万能的RecylerView.Adapter

配合 这篇文章里面写的 Android RecylerView多布局优化 把里面的MyAdapter抽取出来 写了一个JacenRecylerViewAdapter 基本可以实现一些简单的页面 也不需要再写那么多Adapter了。

不多说了,直接帖代码。

/**
 * 暂时想这么多,等哪天把多布局的也集成进来 直接一个adapter就好了
 * @version 1.0
 * @email [email protected]
 * Created by Jacen on 2017/12/31 0:51.
 */

public class JacenRecylerViewAdapter<T> extends RecyclerView.Adapter {
    protected Context context;
    protected OnItemClickListener l;
    protected List<T> mList;

    private SparseArray<IViewItem> sparseArray;

    /**
     * 如果是单布局 则sparseArray.put(0,IViewItemImpl);
     * 否则复写getItemViewType(int position)方法 对应的布局 对应的key
     * @param context
     * @param l
     * @param mList
     * @param sparseArray
     */
    public JacenRecylerViewAdapter(Context context, OnItemClickListener l, List<T> mList, SparseArray<IViewItem> sparseArray) {
        this.context = context;
        this.l = l;
        this.mList = mList;
        this.sparseArray = sparseArray;
    }

    public void updateList(List<T> mList) {
        this.mList = mList;
        notifyDataSetChanged();
    }

    public void addData(T data,int position){
        if(mList == null){
            mList = new ArrayList<T>();
        }
        mList.add(position,data);

        notifyItemInserted(position);
        notifyItemChanged(position);
    }

    public void updateData(T data, int position){
        if(mList == null) return;
        mList.remove(position);
        mList.add(position,data);
    }

    public T getData(int position){
        return mList != null ? mList.get(position) : null ;
    }

    public void removeData(int position){
        mList.remove(position);

        notifyItemRemoved(position);
        notifyItemChanged(position);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return sparseArray.get(viewType).onCreateViewHolder(context,parent,l);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        sparseArray.get(getItemViewType(position)).onBindViewHolder(holder,mList.get(position));
    }

    @Override
    public int getItemCount() {
        return mList == null ? 0 : mList.size();
    }
}

Activity里面 这样写就可以了

SparseArray<IViewItem> sparseArray = new SparseArray();
        sparseArray.put(ChatType.text.getLeft(),new ChatLeftTextViewItemImpl());
        sparseArray.put(ChatType.text.getRight(),new ChatRightTextViewItemImpl());
        //这里是多布局才这么写 如果是单布局的话 这么写就可以了
        //sparseArray.put(0,new ChatLeftTextViewItemImpl());
        //因为adapter源码里面getItemViewType默认返回的就是0
        mAdapter = new MyAdapter(this, mList,sparseArray, this);

由于是多布局 继承JacenRecylerViewAdapter 重写getItemViewType这个方法就好了

/**
 * @version 1.0
 * @email [email protected]
 * Created by Jacen on 2017/12/31 1:55.
 */

public class MyAdapter extends JacenRecylerViewAdapter {
    /**
     * 如果是单布局 则sparseArray.put(0,IViewItemImpl);
     * 否则复写getItemViewType(int position)方法 对应的布局 对应的key
     *
     * @param context
     * @param l
     * @param mList
     * @param sparseArray
     */
    public MyAdapter(Context context, List mList, SparseArray sparseArray,OnItemClickListener l) {
        super(context, l, mList, sparseArray);
    }

    @Override
    public int getItemViewType(int position) {
        ChatMessageVo vo = (ChatMessageVo) mList.get(position);
        return vo.isMe() ? vo.getChatType().getRight() : vo.getChatType().getLeft();
    }
}

搞定!
如果不好得地方 欢迎不吝回复指点

;