天天看點

打造适配RecyclerView的萬能BaseAdapter

前言:上篇文章寫了打造适配ListView的萬能Adapter,有需要的請轉:https://blog.csdn.net/fsx_xiaomei/article/details/88824907

,今天來打造适配RecyclerView的萬能BaseAdapter。

一、一般寫法

  • RecyclerActivity(需要注意的是,RecyclerView一定要setLayoutManager,否則運作程式不會出錯,但是真個RecyclerView不展示)
public class RecyclerActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private List<Bean> mList;
    private LinearLayoutManager manager;
    private PersonRecyclerAdapter mAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler);
        mRecyclerView = findViewById(R.id.recycler);
        initData();
        initView();
    }

    private void initData() {
        mList = new ArrayList<>();
        mList.add(new Bean("xiaoming 1", "湖南省長沙市天心區", 18));
        mList.add(new Bean("xiaoming 2", "湖南省長沙市天心區", 18));
        mList.add(new Bean("xiaoming 3", "湖南省長沙市天心區", 18));
        mList.add(new Bean("xiaoming 4", "湖南省長沙市天心區", 18));
        mList.add(new Bean("xiaoming 5", "湖南省長沙市天心區", 18));
        mList.add(new Bean("xiaoming 6", "湖南省長沙市天心區", 18));
    }

    private void initView() {
        if (manager == null)
            manager = new LinearLayoutManager(this);
        if (mAdapter == null)
            mAdapter = new PersonRecyclerAdapter(this);
        mAdapter.setData(mList);
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setAdapter(mAdapter);
    }
}

           
  • PersonRecyclerAdapter
public class PersonRecyclerAdapter extends RecyclerView.Adapter<PersonRecyclerAdapter.ViewHolder> {

    private List<Bean> mData;
    private Context mContext;

    public void setData(List<Bean> mData) {
        this.mData = mData;
        this.notifyDataSetChanged();
    }

    public PersonRecyclerAdapter(Context mContext) {
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
        ViewHolder viewHolder = new ViewHolder(convertView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
        Bean bean = mData.get(position);
        if (bean != null) {
            viewHolder.tv_name.setText(bean.getName());
            viewHolder.tv_address.setText(bean.getAddress());
            viewHolder.tv_age.setText("年齡:" + bean.getAge());
        }
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView tv_name;
        public TextView tv_address;
        public TextView tv_age;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_name = itemView.findViewById(R.id.tv_name);
            tv_address = itemView.findViewById(R.id.tv_address);
            tv_age = itemView.findViewById(R.id.tv_age);
        }
    }
}
           
  • 實體類Bean(基礎和萬能Adapter都一樣,這裡就是使用的ListView使用過的bean)
public class Bean {
    private String name;
    private String address;
    private int age;
    ...//省略set,get和construct方法
}
           
  • xml布局(省略),運作效果和ListView顯示效果一樣
  • 運作效果
    打造适配RecyclerView的萬能BaseAdapter

二、抽取ViewHolder,打造萬能ViewHolder(因為寫ListView時寫了兩個步驟,RecyclerView就直接寫一個步驟了)

  • 建立CommonRecyclerViewHolder
public class CommonRecyclerViewHolder extends RecyclerView.ViewHolder {

    private View mItemView;
    private SparseArray<View> mViews;

    public CommonRecyclerViewHolder(@NonNull View itemView) {
        super(itemView);
        mViews = new SparseArray<>();
        this.mItemView = itemView;
    }

    public View getView(int viewId) {
        View view = mViews.get(viewId);
        if(view == null){
            view = mItemView.findViewById(viewId);
            mViews.put(viewId,view);
        }
        return view;
    }

    public CommonRecyclerViewHolder setText(int viewId,String text){
        ((TextView)getView(viewId)).setText(text);
        return this;
    }

    public CommonRecyclerViewHolder setImageResource(int viewId,int resId){
        ((ImageView)getView(viewId)).setImageResource(resId);
        return this;
    }
	//這裡還可以根據項目需要添加很多方法
}
           
  • 修改PersonRecyclerAdapter
public class PersonRecyclerAdapter extends RecyclerView.Adapter<CommonRecyclerViewHolder> {

    private List<Bean> mData;
    private Context mContext;

    public void setData(List<Bean> mData) {
        this.mData = mData;
        this.notifyDataSetChanged();
    }

    public PersonRecyclerAdapter(Context mContext) {
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public CommonRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
        CommonRecyclerViewHolder viewHolder = new CommonRecyclerViewHolder(convertView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull CommonRecyclerViewHolder viewHolder, int position) {
        Bean bean = mData.get(position);
        if (bean != null) {
            viewHolder.setText(R.id.tv_name,bean.getName());
            viewHolder.setText(R.id.tv_address,bean.getAddress());
            viewHolder.setText(R.id.tv_age,"年齡:" + bean.getAge());
        }
    }

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

}
           
  • 運作成功

三、打造萬能CommonRecyclerAdapter(打造過程和ListView打造過程差不多,是以也就用一個步驟來寫了)

  • 建立CommonRecyclerAdapter
public abstract class CommonRecyclerAdapter<T> extends RecyclerView.Adapter<CommonRecyclerViewHolder> {

    private List<T> mDatas;
    private int mLayoutId;
    private Context mContext;

    public void setDatas(List<T> datas) {
        this.mDatas = datas;
        this.notifyDataSetChanged();
    }

    public CommonRecyclerAdapter(int mLayoutId, Context mContext) {
        this.mLayoutId = mLayoutId;
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public CommonRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View convertView = LayoutInflater.from(mContext).inflate(mLayoutId, null);
        return new CommonRecyclerViewHolder(convertView);
    }

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

    @Override
    public void onBindViewHolder(@NonNull CommonRecyclerViewHolder commonRecyclerViewHolder, int i) {
        T bean = mDatas.get(i);
        convert(commonRecyclerViewHolder,i,bean);
    }

    public abstract void convert(CommonRecyclerViewHolder viewHolder,int position,T bean);
}

           
  • 修改PersonRecyclerAdapter
public class PersonRecyclerAdapter extends CommonRecyclerAdapter<Bean> {

    public void setData(List<Bean> data) {
        setDatas(data);
    }

    public PersonRecyclerAdapter(int layoutId, Context context) {
        super(layoutId, context);
    }

    @Override
    public void convert(CommonRecyclerViewHolder viewHolder, int position, Bean bean) {
        if (bean != null) {
            viewHolder.setText(R.id.tv_name,bean.getName());
            viewHolder.setText(R.id.tv_address,bean.getAddress());
            viewHolder.setText(R.id.tv_age,"年齡:" + bean.getAge());
        }
    }
}

           
  • 修改RecyclerActivity
if (mAdapter == null)
            mAdapter = new PersonRecyclerAdapter(R.layout.item_list,this);
           
  • 運作成功。

四、總結

  • 可以看到,做RecyclerView的萬能Adapter和ListView是差不多的,隻要弄清楚了一個另外一個就很好了解了
  • 代碼位址: https://github.com/xiaomei888/baselistadapter/tree/master

繼續閱讀