我正在使用下面的代码来测试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,并且不会通知您的适配器有关更改的信息