万用RecyclerView.Adapter,不写重复的代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010339039/article/details/53703467

已经年底了。坐等过年了。今年比较忙了。所以写代码都在想尽量不写重复的代码,连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好用太多太多。

加好友:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u010339039/article/details/53703467