前言:上篇文章写了打造适配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