DiffUtil(存疑)

初级

ComplexTypeDiffCallBack

package joggle.diffutils;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.util.DiffUtil;

import java.util.List;

import bean.sync.ComplexType;

/**
 * Created on 2018/6/27.
 *
 * @desc DiffUtil是RecycleView support library v7 24.2.0新增类
 * 比两数据表并算出一系列将旧数据表转新数据表操作,即局刷
 */
public class ComplexTypeDiffCallBack extends DiffUtil.Callback {
    private List<ComplexType> oldData;
    private List<ComplexType> newData;

    public ComplexTypeDiffCallBack(List<ComplexType> oldData, List<ComplexType> newData) {
        this.oldData = oldData;
        this.newData = newData;
    }

    @Override
    public int getOldListSize() {
        return oldData.size();
    }

    @Override
    public int getNewListSize() {
        return newData.size();
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return oldData.get(oldItemPosition).equals(newData.get(newItemPosition));
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        return oldData.get(oldItemPosition).equals(newData.get(newItemPosition));
    }    
}

主代码

// 局刷
DiffUtil.DiffResult diffResult = DiffUtil.
calculateDiff(new ComplexTypeDiffCallBack(complexTypeList, LitePal.findAll(ComplexType.class)), false);
// DiffUtil.DiffResult之dispatchUpdatesTo()传Adapter       
diffResult.dispatchUpdatesTo(paraConfigChooseComplexTypeAdapter);
// 设Adapter新数据
complexTypeList = LitePal.findAll(ComplexType.class);                                           paraConfigChooseComplexTypeAdapter.setParaConfigChooseComplexTypeData(complexTypeList);

高级

ComplexTypeDiffCallBack

package joggle.diffutils;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.util.DiffUtil;

import java.util.List;

import bean.sync.ComplexType;

/**
 * Created on 2018/6/27.
 *
 * @desc DiffUtil是RecycleView support library v7 24.2.0新增类
 * 比两数据表并算出一系列将旧数据表转新数据表操作,即局刷
 */
public class ComplexTypeDiffCallBack extends DiffUtil.Callback {
    private List<ComplexType> oldData;
    private List<ComplexType> newData;

    public ComplexTypeDiffCallBack(List<ComplexType> oldData, List<ComplexType> newData) {
        this.oldData = oldData;
        this.newData = newData;
    }

    @Override
    public int getOldListSize() {
        return oldData.size();
    }

    @Override
    public int getNewListSize() {
        return newData.size();
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return oldData.get(oldItemPosition).equals(newData.get(newItemPosition));
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        return oldData.get(oldItemPosition).equals(newData.get(newItemPosition));
    }

    /**
     * DiffUtil高级用法
     *
     * @param oldItemPosition 老位
     * @param newItemPosition 新位
     * @return 实体
     */
    @Override
    @Nullable
    public Object getChangePayload(int oldItemPosition, int newItemPosition) {
        // 定向刷新中部分更新(效率最高)
        // 无Item闪动
        ComplexType complexTypeOld = oldData.get(oldItemPosition);
        ComplexType complexTypeNew = newData.get(newItemPosition);
        // 不比核心字段(定等)
        Bundle payload = new Bundle();
        if (complexTypeOld.getCjrq() != complexTypeNew.getCjrq()) {
            payload.putLong("KEY_CJRQ", complexTypeNew.getCjrq());
        }
        if (!complexTypeOld.getFzlx().equals(complexTypeNew.getFzlx())) {
            payload.putString("KEY_FZLX", complexTypeNew.getFzlx());
        }
        if (!complexTypeOld.getServiceId().equals(complexTypeNew.getServiceId())) {
            payload.putString("KEY_SERVICE_ID", complexTypeNew.getServiceId());
        }
        if (!complexTypeOld.getSfzy().equals(complexTypeNew.getSfzy())) {
            payload.putString("KEY_SFZY", complexTypeNew.getSfzy());
        }
        if (complexTypeOld.getLocalAdd() != complexTypeNew.getLocalAdd()) {
            payload.putInt("KEY_LOCAL_ADD", complexTypeNew.getLocalAdd());
        }
        if (payload.size() == 0) {
            // 无变返空
            return null;
        }
        // public Object getChangePayload()非空时onChange通Partial bind,无Item闪动(否有)
        return payload;
    }
}

适配器

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
    final ComplexType complexType = complexTypeList.get(position);
    // 数据存itemView之Tag以便点获
    older.itemView.setTag(complexType);
    holder.tvBasicConfigChoose.setText(complexType.getFzlx());        
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position, @NonNull List<Object> payloads) {
    if (payloads.isEmpty()) {
        onBindViewHolder(holder, position);
    } else {
        ComplexType complexType = complexTypeList.get(position);
        Bundle payload = (Bundle) payloads.get(0);
        for (String key : payload.keySet()) {
            switch (key) {
                // 此可用payload数据(data亦新亦可用)
                case "KEY_CJRQ":
                    holder.tvBasicConfigChoose.setText(complexType.getFzlx());
                    break;
                case "KEY_FZLX":
                    holder.tvBasicConfigChoose.setText(complexType.getFzlx());
                    break;
                case "KEY_SERVICE_ID":
                    holder.tvBasicConfigChoose.setText(complexType.getFzlx());
                    break;
                case "KEY_SFZY":
                    holder.tvBasicConfigChoose.setText(complexType.getFzlx());
                    break;
                 ase "KEY_LOCAL_ADD":
                    holder.tvBasicConfigChoose.setText(complexType.getFzlx());
                    break;
                default:
                    break;
            }
        }
    }
}

主代码

// 局刷
DiffUtil.DiffResult diffResult = DiffUtil.
calculateDiff(new ComplexTypeDiffCallBack(complexTypeList, LitePal.findAll(ComplexType.class)), false);
// DiffUtil.DiffResult之dispatchUpdatesTo()传Adapter      
diffResult.dispatchUpdatesTo(paraConfigChooseComplexTypeAdapter);
// 设Adapter新数据
complexTypeList = LitePal.findAll(ComplexType.class);                                                paraConfigChooseComplexTypeAdapter.setParaConfigChooseComplexTypeData(complexTypeList);

疑问

  • 初级偶现刷新时Item闪动
  • 高级适配器之三参onBindViewHolderpayloads总为空

猜你喜欢

转载自blog.csdn.net/zsp_android_com/article/details/80847928