我们平时要实现一个列表的功能。通常第一步要创建一个Adapter类,创建相应的ViewHolder类,然后实现各种回调方法,想想就比较繁琐。貌似做了好多重复的工作。今天就封装了下adapter。只需短短几行代码,就可以实现列表的功能。话不多说,直接上代码。可以直接去github上下载。如果你觉得实用,简单,欢迎评论反馈。支持一下。感谢。
BaseAdapter的关键代码:
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(layoutResId, parent, false);
return new BaseViewHolder(view);
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
onBindViewHolder(holder, mData, position);
}
这个类总共编写的代码就只有6行。
BaseViewHolder的关键代码:
/**
* 根据资源id得到view
* @param resId 控件id
* @param <T> view
* @return view
*/
public <T extends View> T getView(int resId){
View v =mViews.get(resId);
if (v==null){
v=itemView.findViewById(resId);
mViews.put(resId,v);
}
return (T) v;
}
/**
* 直接设置textview的text
* @param resId 控件id
* @param text 显示内容
* @return 本类
*/
public BaseViewHolder setText(int resId,String text){
View v =mViews.get(resId);
if (v==null){
v=itemView.findViewById(resId);
mViews.put(resId,v);
}
((TextView)v).setText(text);
return this;
}
/**
* 直接设置ImageView的src
* @param resId 控件id
* @param drawableId 图片id
* @return 本类
*/
public BaseViewHolder setImage(int resId, int drawableId){
View v =mViews.get(resId);
if (v==null){
v=itemView.findViewById(resId);
mViews.put(resId,v);
}
((ImageView)v).setImageResource(drawableId);
return this;
}
可通过getView()方法获取所有控件绑定数据。也可拓展相应的方法(比如,setText,setImage),可实现链式绑定。
我们平时用的时候上面BaseAdapter和BaseViewHolder两个类基本是不动的。
激动人心的时刻马上要到了,下边我们展示下。
ItemBean测试类:
public class ItemBean {
public String name;
public int resId=R.mipmap.ic_launcher;
}
实现第一种方式:
recyclerView.setAdapter(new BaseAdapter<ItemBean>(R.layout.layout_item,data) {
@Override
public void onBindViewHolder(BaseViewHolder holder, ArrayList<ItemBean> data, int position) {
((TextView)holder.getView(R.id.tvName)).setText(data.get(position).name);
((ImageView)holder.getView(R.id.img)).setImageResource(data.get(position).resId);
}
});
是不是特别简单。接下来我们看下第二种方式:
recyclerView.setAdapter(new BaseAdapter<ItemBean>(R.layout.layout_item,data){
@Override
public void onBindViewHolder(BaseViewHolder holder, ArrayList<ItemBean> data, int position) { holder.setText(R.id.tvName,data.get(position).name).setImage(R.id.img,data.get(position).resId);
}
});
这样下来,我们需要实现一个列表适配器,只需要编写一行代码就可以实现。是不是特别简单。
如果有自己的需求或者代码量特别大,可以单独出一个类 处理。