我正在使用下面的代码来测试DiffUtil实现。


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


我的新列表比旧列表多一个项目。但是,即使在适配器上调用dispatchUpdatesTo之后,我的适配器也会显示旧列表。

  val diffResult = DiffUtil.calculateDiff(MyDiffCallback(newlist, commitmentList),true);
  commitmentList=newlist
  diffResult.dispatchUpdatesTo(commitmentAdapter);


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);    }


}


适配器

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"
            }

        }
    }

}

最佳答案

在你的代码中

val diffResult = DiffUtil.calculateDiff(MyDiffCallback(newlist, commitmentList),true);
commitmentList=newlist


commitmentListnewlist指的是同一对象。

因此,问题可能是当您收到带有更多项目的新列表时,您的commitmentList也已经是最新的了。

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

09-12 12:02