为什么我要在数据更改之前在onResume()中调用notifyItemChanged()?

问题描述 投票:1回答:1

[从细节活动返回时,要从上次选择的RecyclerView项中删除突出显示的背景色,我在onResume()中尝试了此操作:

mAdapter.notifyItemChanged(mAdapter.selectedPos);
mAdapter.selectedPos = RecyclerView.NO_POSITION;

以及[onBindViewHolder()中的这个:

viewHolder.itemView.setSelected(selectedPos == position);

[onBindViewHolder()总是在onResume()之后调用,所以selectedPos == position给出正确的结果,但我不明白为什么不更早调用它。

为什么我不必将selectedPos保存到临时变量中并在notifyItemChanged(temp)更改后调用selectedPos

提前感谢。

android android-recyclerview onresume notifyitemchanged
1个回答
0
投票

onResume in在您转到其他活动并返回时返回,它是Activity生命周期的一部分。但是onBindViewHolder是与适配器设计模式有关的方法,随着您滚动适配器生成单元项的位置,它会继续调用。因此,需要对此方法进行任何更改,并且可以使用notifyItemChanged(position)触发更改。

还有另一种实现方式:这将是一个正确的实现,要从上次选择的RecyclerView中删除突出显示的背景色,您必须在适配器的Item列表上保留一些突出显示的属性。

ListItemModel{
 // ohter attributes goes here
 Boolean isSelected = false; // encapsulate
}

适配器中的项目如下,

private List<ListItemModel> itemList = new ArrayList()
viewHolder.itemView.setSelected(itemList[position]);

在适配器中

public void unselectAll(){
 for(ListItemModel item: itemList){
  item.isSelected = false
 }
 notifyItemChanged()
}
© www.soinside.com 2019 - 2024. All rights reserved.