DiffUtil 不更新 recyclerview

var*_*ava 3 android android-adapter android-recyclerview

我正在使用下面的代码来测试DiffUtil implementationaion.As per doc-

DiffUtil 是一个实用程序类,可以计算两个列表之间的差异并输出将第一个列表转换为第二个列表的更新操作列表。

我的新列表比旧列表多一项。但我的适配器仅在适配器上调用 dispatchUpdatesTo 后才显示旧列表。

  val diffResult = DiffUtil.calculateDiff(MyDiffCallback(newlist, commitmentList),true);
  commitmentList=newlist
  diffResult.dispatchUpdatesTo(commitmentAdapter);
Run Code Online (Sandbox Code Playgroud)

MyDiffCallback.java

public class MyDiffCallback extends DiffUtil.Callback{

    ArrayList<Commitment> oldPersons;
    ArrayList<Commitment> newPersons;

    public MyDiffCallback(ArrayList<Commitment> newPersons, ArrayList<Commitment> oldPersons) {
        this.newPersons = newPersons;
        this.oldPersons = oldPersons;
    }

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

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

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {

        return(oldPersons.get(oldItemPosition)
                .equals(newPersons.get(newItemPosition)));    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {

        return(oldPersons.get(oldItemPosition)
                .compareTo(newPersons.get(newItemPosition))==0);    }


}
Run Code Online (Sandbox Code Playgroud)

适配器

class CommitmentAdapter(private val context: Context, private val data: ArrayList<Commitment>?) : RecyclerView.Adapter<CommitmentAdapter.ViewHolder>() {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CommitmentAdapter.ViewHolder {

        val itemView = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_commitment, parent, false)

        return ViewHolder(itemView)
    }

    override fun getItemCount(): Int {
        return data!!.size
    }

    override fun onBindViewHolder(holder: CommitmentAdapter.ViewHolder, position: Int) {

        holder.bindata(data!![position],position,context)
    }

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bindata(data: Commitment,position:Int,context: Context) {
          var pedoDB: PedometerDaoImpl=PedometerDaoImpl(context)
            itemView.tvDate.text = "Start date : " + getDat(data.startDate!!.toLong()* 1000L) + "  End date : " + getDat(data.endDate!!.toLong()* 1000L)
            itemView.pb_calories.max = 100

            itemView.clCommitment.tag=position
            itemView.clCommitment.setOnClickListener {
                val intent= Intent(context,EditCommitment::class.java).putExtra("Data",data)
                context.startActivity(intent)

            }


        }

        fun getDat(timeStamp: Long): String {

            try {
                val sdf = SimpleDateFormat("dd/MM/yyyy")
                val netDate = Date(timeStamp)
                return sdf.format(netDate)
            } catch (ex: Exception) {
                return "xx"
            }

        }
    }

}
Run Code Online (Sandbox Code Playgroud)

sne*_*yan 5

在你的代码中

val diffResult = DiffUtil.calculateDiff(MyDiffCallback(newlist, commitmentList),true);
commitmentList=newlist
Run Code Online (Sandbox Code Playgroud)

commitmentList并且newlist指的是同一个对象。

因此,问题可能在于,当您收到包含更多项目的新列表时,您的列表commitmentList也已经是最新的。

在这种情况下,您的areItemsTheSame()方法将始终返回true,并且您的适配器不会收到有关更改的通知