簡體   English   中英

DiffUtil不更新recyclerview

[英]DiffUtil not updating recyclerview

我正在使用下面的代碼來測試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,並且不會通知您的適配器更改

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM