已经年底了。坐等过年了。今年比较忙了。所以写代码都在想尽量不写重复的代码,连copy都要尽量避免,
因为copy也要维护,维护起来也是很蛋疼的事情。所有要避免重复写同样的代码。
效果图:
现在写一个关于RecyclerView的adapter的父类。
adapter中主要就是两个东西在变化,一个就是实体类,一个就是item的布局在变化,然后其他的变化几乎都没了。都是相同的。当然这两个直接就使用泛型就可以解决了。
当然还有一些事件的监听回调。直接以addListener().的方式搞定会比较好点。因为好像RecyclerView好像不像ListView那样有个OnitemClick事件我就在父类中写了个,以后要用可以直接add..()就可以了。
先来看两个泛型,在创建RecyclerView.Adapter如果不指定ViewHolder的类型,他会报一个RowsType的警告,并且你还要自己去强转也是件很麻烦的事情。
public abstract class MyBaseAdapter<T, V extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<V>
T就是维护的数据的泛型。V是ViewHolder的泛型,所以要V extends RecyclerView.ViewHolder,这个泛型要是RecyclerView.ViewHolder的子类。
我们再来看看构造方法:
public MyBaseAdapter(List<T> list, Context context) {
this.context = context;
if (list != null) {
this.list.addAll(list);
}
}
这里传递了两个两个参数,一个List,一个Context,传进来的List是以addAll()的方式添加。如果是以this.list = list 的话,会很有可能在子线程中对list进行了操作,然后adapter没有收到刷新通知,那么adapter就会很生气,然后崩溃。
@Override
public int getItemCount() {
return list.size();
}
这个方法以后就不用在动他了。简直是,这个方法我都快可以倒着写他了。
@Override
public abstract V onCreateViewHolder(ViewGroup container, int type);
@Override
public abstract void onBindViewHolder(V holder, int position);
这两个方法是需要子类去对他重写的。
还有个事情,就是在adapter经常要去加载网络图片,但是偶尔又会没有,所以做了个懒加载。要使用的时候才去实例化
protected synchronized void displayImageView(ImageView img, String url) {
if (options == null) {
//使用的时候才加载
imageLoader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher) // resource or drawable
.showImageForEmptyUri(R.drawable.ic_launcher) // resource or drawable
.showImageOnFail(R.drawable.ic_launcher) // resource or drawable
.cacheInMemory(true) // default
.cacheOnDisk(true) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.bitmapConfig(Bitmap.Config.ARGB_4444) // default
.build();
}
imageLoader.displayImage(url, img, options);
}
所以子类调用的时候就直接使用displayImageView(img, url);传递控件和地址就是件很方便的事情了。
还添加了其他两个我个人比较常用的方法刷新所有数据:
public void refreshAllData(List<T> list) {
this.list.clear();
if (list != null) {
this.list.addAll(list);
}
this.notifyDataSetChanged();
}
好了,我们再来看看如何调用他:
//要制定两个泛型
public class MyRecyleAdapter extends MyBaseAdapter<ClassifyBean , MyRecyleAdapter.ViewHolder> {
//重写一下构造方法,但是我们基本不用做什么
public MyRecyleAdapter(List<ClassifyBean> list, Context context) {
super(list, context);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup container, int type) {
return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.layout_item , container , false));
}
@Override
public void onBindViewHolder(ViewHolder holder,final int position) {
final ClassifyBean cb = list.get(position);
displayImageView(holder.imgLogo , cb.getUrl());
holder.tvName.setText(cb.getName());
holder.llRoot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(lis != null){
lis.onItemClick(view,cb,position);
}
}
});
}
//viewholder还是和以前一样。
class ViewHolder extends RecyclerView.ViewHolder{
ImageView imgLogo;
TextView tvName;
LinearLayout llRoot;
public ViewHolder(View itemView) {
super(itemView);
imgLogo =(ImageView)itemView.findViewById(R.id.img_logo);
tvName =(TextView)itemView.findViewById(R.id.tv_name);
llRoot = (LinearLayout)itemView.findViewById(R.id.ll_root);
}
}
}
个人觉得还是减少了很多工作量。
RecyclerView确实比listview好用太多太多。
加好友: