[英]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
commitmentList
和newlist
指的是相同的對象。
因此,問題可能是當您收到帶有更多項目的新列表時,您的commitmentList
也已經是最新的。
在這種情況下,您的areItemsTheSame()
方法將始終返回 true,並且不會通知您的適配器更改
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.