首页投稿(暂停使用,暂停投稿)程序员

封装Recycleview的BaseAdapter

2017-06-28  本文已影响107人  王小贱_ww

善于封装,提高开发效率,减少ctrl+c、ctrl+v,学会tou lan

Recycleview的基本用法

public class TestActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private List<String> mDatas;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initRecyclerView();
    }

    private void initRecyclerView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mDatas = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            mDatas.add("item data is " + i);
        }
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplication()));
        MyAdapter adapter = new MyAdapter();
        mRecyclerView.setAdapter(adapter);
    }

    class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {


        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_textview, parent, false);
            return new MyViewHolder(view);
        }

        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            holder.textview.setText(mDatas.get(position));
        }

        @Override
        public int getItemCount() {
            return mDatas.size();
        }

        class MyViewHolder extends RecyclerView.ViewHolder {
            TextView textview;

            public MyViewHolder(View itemView) {
                super(itemView);
                textview = (TextView) itemView.findViewById(R.id.item_textview);
            }
        }
    }
}

项目中有N个RecyclerView,岂不是要写N个Viewholder和N个Adapter(岂不是要累死),封装一个BaseAdapter减少代码量,还是很有必要的。

1.关于ViewHolder的封装

先看看ViewHolder都有哪些作用(提炼出来)1.onCreateViewHolder里面new Viewholder 2.绑定viewId和onBindViewHolder里面赋值

public class ViewHolder extends RecyclerView.ViewHolder {
    private SparseArray<View> mViews;
    private View itemView;

    public ViewHolder(View itemView) {
        super(itemView);
        mViews = new SparseArray<>();
        this.itemView = itemView;
    }

    public ViewHolder get(Context context, ViewGroup parent, int layoutId) {
        View view = LayoutInflater.from(context).inflate(layoutId, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    /**
     * 绑定viewId(泛型方法)
     * @param viewId
     * @param <T>
     * @return
     */
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = itemView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }


 /**
     * 给TextView赋值  根据项目需求你还可以添加setImageView、点击事件等等
     * @param viewId
     * @param text
     * @return
     */
    public ViewHolder setText(int viewId, String text) {
        TextView textView = getView(viewId);
        textView.setText(text);
        return this;
    }

}

2.BaseAdapter

public abstract class CommonAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
    private List<T> mDatas;
    private Context mContext;
    private int layoutId;

    public CommonAdapter(Context mContext, List<T> mDatas, int layoutId) {
        this.mDatas = mDatas;
        this.mContext = mContext;
        this.layoutId = layoutId;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        /**
         * 创建Viewholder,绑定布局id,内部实现
         */
        ViewHolder holder = ViewHolder.get(mContext, parent, layoutId);
        return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        /**
         * 对于控件的赋值,需要子类自己实现,这里我们用抽象方法
         */
        convert(holder, mDatas.get(position));

    }

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

    public abstract void convert(ViewHolder holder, T t);
}

3.简单使用

 mRecyclerView.setAdapter(new CommonAdapter<String>(this, mDatas, R.layout.item_textview) {
            @Override
            public void convert(ViewHolder holder, String o) {
                holder.setText(R.id.item_textview, o);
            }
        });-----so easy
上一篇下一篇

猜你喜欢

热点阅读