您的位置:首页 > 其它

使用RecycleView时候的adapter的简单封装

2016-02-13 14:04 323 查看
大家可能会看到,每次我们使用listview,recycleview的时候,如果只是简单的使用,我们大都会给一个adapter适配器,来接收和传递数据,但是当我们的项目很大的时候,是不是要写很多的adapter,并且有的时候代码几乎是一样的,简单来说也就是使用textview、imageview,来设置文字和图片,那么可不可以简单的封装一下,把公共的提取出来,我们每次用的时候只是,把变的数据(布局可能变,布局参数的设置值可能变)我们自己去实现。

启发

借鉴思路:用过github上的一个开源的项目[base-adapter-helper]:

(https://github.com/JoanZapata/base-adapter-helper)

这个如果大家想要了解,可以去试试的,使用起来也是很简单的。我在这里只是简单的上传一张图,



当然了哈,如果想要使用,还是要把他的这个项目依赖一下哈,或者是直接把四个java代码文件copy到你的项目中即可。

[code]compile 'com.joanzapata.android:base-adapter-helper:1.1.11'


来看下我们的实现

好了,接下来开始我们的adapter的简单封装吧。(适用于recycleview):

我们知道使用recycleview的时候,viewholder是强制的,而且我们如果只是简单的使用,我们一般会在把viewholder写在一起,这里我们分开来写,也就是CommentViewHolder和CommentAdapter

CommentViewHolder.java:

[code]package com.example.baseadapterhelperdemo.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by 若兰 on 2016/2/13.
 * 一个懂得了编程乐趣的小白,希望自己
 * 能够在这个道路上走的很远,也希望自己学习到的
 * 知识可以帮助更多的人,分享就是学习的一种乐趣
 * QQ:1069584784
 * csdn:http://blog.csdn.net/wuyinlei
 */

public class CommentViewHolder extends RecyclerView.ViewHolder {

    /**
     * 这个稀疏数组,网上说的是提高效率的
     */
    private final SparseArray<View> views;
    private View convertView;

    /**
     * 如果用到了,比如我们用glide加载图片的时候,还有其他的需要用到上下文的时候
     */
    private Context mContext;

    public CommentViewHolder(View itemView) {
        super(itemView);
        views = new SparseArray<>();
        convertView = itemView;
        mContext = itemView.getContext();
    }

    /**
     * 返回一个具体的view对象 
     * 这个就是借鉴的base-adapter-helper中的方法
     *
     * @param viewId
     * @param <T>
     * @return
     */
    protected <T extends View> T getView(int viewId) {
        View view = views.get(viewId);
        if (view == null) {
            view = convertView.findViewById(viewId);
            views.put(viewId, view);
        }
        return (T) view;
    }

    public void setText(int resId, String text) {
        TextView view = getView(resId);
        view.setText(text);
    }

    /**
     * 下面的这个是加载显示图片的,我用到了glide,这里只是演示,并没有显示
     *
     * @param resId
     * @param url
     */
    public void setImageByUrl(int resId, String url) {
        ImageView imageView = getView(resId);
        //Glide.with(mContext).load(url).asBitmap().into(imageView);
    }

    //// TODO: 2016/2/13  当然了哈,在这里我们可以定义其他的方法,这个demo我只是设置了textview,想要使用其他空间的
    //自己去定义方法

}


CommentAdapter.java:

[code]package com.example.baseadapterhelperdemo.adapter;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
 * Created by 若兰 on 2016/2/13.
 * 一个懂得了编程乐趣的小白,希望自己
 * 能够在这个道路上走的很远,也希望自己学习到的
 * 知识可以帮助更多的人,分享就是学习的一种乐趣
 * QQ:1069584784
 * csdn:http://blog.csdn.net/wuyinlei
 */

public abstract class CommentAdapter<T> extends RecyclerView.Adapter<CommentViewHolder> {

    /**
     * 这里我我们是提取的公共的,所以我们在这用泛型T,而不是给出具体的值,具体的交给我们的实现类去传入
     */
    private List<T> mTList;
    //布局id
    private int layoutId;

    /**
     * 这里构造函数,传入数据的list和布局
     *
     * @param TList
     * @param layoutId
     */
    public CommentAdapter(List<T> TList, int layoutId) {
        mTList = TList;
        this.layoutId = layoutId;
    }

    @Override
    public CommentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(layoutId, null);
        return new CommentViewHolder(view);
    }

    @Override
    public void onBindViewHolder(CommentViewHolder holder, int position) {
        convert(holder, mTList.get(position));
    }

    /**
     * 留给调用者去实现
     *
     * @param holder
     * @param t
     */
    public abstract void convert(CommentViewHolder holder, T t) ;

    @Override
    public int getItemCount() {
        return mTList.size();
    }
}


好了,简单的封装就可以了,接下来我们来看下怎么使用吧。

[code]package com.example.baseadapterhelperdemo.adapter;

import com.example.baseadapterhelperdemo.R;
import com.example.baseadapterhelperdemo.bean.User;

import java.util.List;

/**
 * Created by 若兰 on 2016/2/13.
 * 一个懂得了编程乐趣的小白,希望自己
 * 能够在这个道路上走的很远,也希望自己学习到的
 * 知识可以帮助更多的人,分享就是学习的一种乐趣
 * QQ:1069584784
 * csdn:http://blog.csdn.net/wuyinlei
 */

public class MyAdapter extends CommentAdapter<User> {
    /**
     * 这里构造函数,传入数据的list和布局
     *
     * @param TList
     * @param layoutId
     */
    public MyAdapter(List<User> TList, int layoutId) {
        super(TList, R.layout.item);
    }

    /**
     * 这个我们使用的时候直接传入数据即可
     * @param list
     */
    public MyAdapter(List<User> list){
        super(list,R.layout.item);
    }

    @Override
    public void convert(CommentViewHolder holder, User user) {

        //在这里我们直接绑定数据就行了,是不是少了很多的重复的代码呢
        holder.setText(R.id.tvName,user.getName());
        holder.setText(R.id.tvSex,user.getSex());
    }
}


使用到的user 的bean类:

[code]public class User {
    private String name;
    private String sex;

    public User(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}


这样就行了,其他的给recycleview设置一些简单的设置和适配器,和原来的是一样的,如果有疑问可以看下RecycleView的简单介绍

这里,我们看到代码量是有点多,但是要知道,我们这里只是使用了一个adapter,如果我们的项目中使用了十几个,二十几个,而且每个的item数量很多,这样写就会节省很多的代码的哈,如果有兴趣也可以去看下base-adapter-helper的实现,好了,附件一下github该项目的地址:

https://github.com/wuyinlei/BaseAdapterHelperDemo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: