我每次需要更新RecycleView中的警报时都会创建一个新的Adapter和一个新的RecycleView。不幸的是,它只是一个非常昂贵的解决方案"。我在网上看到我可以使用DiffUti,但我不知道如何实现它。 我创建了一个DiffUtil类:
public class AlarmDiffCallBack extends DiffUtil.Callback{
private final ArrayList<SingleAlarm> oldList;
private final ArrayList<SingleAlarm> newList;
public AlarmDiffCallBack( ArrayList<SingleAlarm> oldList, ArrayList<SingleAlarm> newList) {
this.oldList = oldList;
this.newList = newList;
}
@Override
public int getOldListSize() {
return oldList.size();
}
@Override
public int getNewListSize() {
return newList.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldList.get(oldItemPosition).getAlarmIndex() == newList.get(newItemPosition).getAlarmIndex();
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return oldList.get(oldItemPosition).getAlarmIndex() == newList.get(newItemPosition).getAlarmIndex();
}
@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
// Implement method if you're going to use ItemAnimator
return super.getChangePayload(oldItemPosition, newItemPosition);
}
}
这是我想要更新recycleView的地方之一(用#Diff;替换&#34; creatAdapter&#34;):
public void add_alarm(final Context context) {
//creating a new alarm and set the relevant varible to the addAlarm function
button_add_alarm.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//the calndar is without the right day, the day is added in the handler(int the loop)
Calendar calendarForAlarm = timePickerToCalendar(alarmTimePicker);
alarmsList = alarmHandler.add_alarm(context, checkBoxes, alarmMessage, alarmsList, alarm_manager, calendarForAlarm, repeatAlarm);
alarmsList=alarmHandler.sortAlarms(alarmsList);
creatAdapt();
}
});
}
我只是想弄清楚如何使用这个类来更新我的适配器。我对Android和编程一般都很新,希望这个引用还可以。谢谢!
答案 0 :(得分:0)
所以基本上你需要你的适配器有一个方法来更新你的数据,如:
public void setNewAlarms(List<SingleAlarm> newAlarms){
// oldAlarms is the list of items currently displayed by the adapter
AlarmDiffCallBack diffCallBack = new AlarmDiffCallBack(oldAlarms, newAlarms);
// Second parameter is to detect "movement". If your list is always sorted the same way, you can set it to false to optimize
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallBack, true);
// This will notify the adapter of what is new data, and will animate/update it for you ("this" being the adapter)
diffResult.dispatchUpdatesTo(this);
}
然后你必须使用新数据从适配器外部调用myAdapater.setNewAlarms(alarmsList)
。
您还可以查看实现它的following repository
答案 1 :(得分:0)
您的 isItemsTheSame 和 areContentsTheSame 方法是相同的。
如果areItemsTheSame返回true并且areContentsTheSame返回false,则仅触发getChangePayload,因此我认为它永远不会触发