为你的RecyclerView.Adapter添加通用DiffUtil适配器

首先正常的DiffUtil使用如下:
还没用过改工具的可以看下这位大神的博客:
http://blog.csdn.net/zxt0601/article/details/52562770

  DiffUtil.DiffResult diffResult= DiffUtil.calculateDiff(new MyDiff(mNewDatas,mOldDatas),true);
        diffResult.dispatchUpdatesTo(adapter);

我们可以将DiffUtil.CallBack封装一下

public class MyDiff<T extends BaseData> extends DiffUtil.Callback {
    private List<T> mNewDatas,mOldDatas;

    public MyDiff(List<T> mNewDatas, List<T> mOldDatas) {
        this.mNewDatas = mNewDatas;
        this.mOldDatas = mOldDatas;
    }

    @Override
    public int getOldListSize() {
        return mOldDatas!=null?mOldDatas.size():0;
    }

    @Override
    public int getNewListSize() {
        return mNewDatas!=null?mNewDatas.size():0;
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return    mOldDatas.get(oldItemPosition).getBaseId().equals
        (mNewDatas.get(newItemPosition).getBaseId());
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        BaseData oldBaseData=mOldDatas.get(oldItemPosition);
        BaseData newBaseData=mNewDatas.get(newItemPosition);
        if (oldBaseData.getBaseName().equals(newBaseData.getBaseName())){
            return false;
        }
        return true;
    }
}

这里List的数据继承BaseData,用于areItemsTheSame方法和areContentsTheSame方法的判断
BaseData如下:

public class BaseData {
    String baseId;//用于areItemsTheSame方法的判断
    String baseName;//用于areContentsTheSame方法的判断

    public String getBaseId() {
        return baseId;
    }

    public void setBaseId(String baseId) {
        this.baseId = baseId;
    }

    public String getBaseName() {
        return baseName;
    }

    public void setBaseName(String baseName) {
        this.baseName = baseName;
    }
}

接下来我们在adapter里使用DiffUtil

public class MyAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<T> mDatas;

    public MyAdapter(List<T> mDatas) {
        this.mDatas = mDatas;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }
    public void upDate(List<T> newDatas){
        if (newDatas==null) {
            return;
        }
       DiffUtil.DiffResult diffResult= DiffUtil.calculateDiff(new MyDiff(newDatas,mDatas),true);
        diffResult.dispatchUpdatesTo(this);
        this.mDatas=newDatas;//别忘了更新数据
    }
}

这里主要是让大家明白adapter里使用DiffUtil,请看upDate方法和构造方法.
先看下实体类的使用

public class TestData extends BaseData {
    String id;
    String name;
    String sex;
    String year;

    public String getId() {
        return id;
    }

    /**
     * 用于DiffUtil.CallBack的数据判断
     * areItemsTheSame方法
     * @param id
     */
    public void setId(String id) {
        this.id = id;
        setBaseId(id);//BaseData里的方法
    }

    public String getName() {
        return name;
    }

    /**
     * 用于DiffUtil.CallBack的二次判断
     * areContentsTheSame方法
     * @param name
     */
    public void setName(String name) {
        this.name = name;
        setBaseName(name);//BaseData里的方法
    }

    public String getSex() {
        return sex;
    }

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

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }
}

继承BaseData,这里我先根据id和name去做判断,在实际使用中,大家根据数据的不同性去选择两个或者更多的变量去做判断.
关于基类BaseData,我这里是写两个变量做判断,根据需求大家可以定义N个变量,实体类也要一一对应

我们开始在Actvity里更新数据

public class MainActivity extends AppCompatActivity {
        private RecyclerView recyclerView;
    private List<TestData> mNewDatas,mOldDatas;
    private MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }
    private void init(){
        mNewDatas=new ArrayList<>();
        for (int i=0;i<5;i++){
            TestData td=new TestData();
            td.setId(""+i);
            td.setName("陈"+i);
            mNewDatas.add(td);
        }
        recyclerView= (RecyclerView) findViewById(R.id.mRecyclerView);
        recyclerView.setAdapter(new MyAdapter(mNewDatas));

    }

    /**
     * 默认
     */
    private void actviityUpDate(){
        mOldDatas=new ArrayList<>();
        for (int i=5;i<10;i++){
            TestData td=new TestData();
            td.setId(""+i);
            td.setName("王"+i);
            mOldDatas.add(td);
        }
        adapter.upDate(mOldDatas);
    }
}

执行actviityUpDate方法便可以更新数据.
这篇博客主要是讲思路,Demo没有完整的写出来
,有必要的话会给出完整Demo.

到这里结束,有写得不好的地方请大家多多指教.
谢谢.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值