【问题标题】:Why can I call notifyItemChanged() in onResume() before data has changed?为什么我可以在数据更改之前在 onResume() 中调用 notifyItemChanged()?
【发布时间】:2019-11-28 01:30:31
【问题描述】:

当我从详细信息活动返回时,要从最后选择的 RecyclerView 项目中删除突出显示的背景颜色,我在onResume() 中尝试了这个:

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

这个在onBindViewHolder():

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

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

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

提前致谢。

【问题讨论】:

  • 你可以了解android视图系统是如何工作的here
  • 谢谢,这很有趣。我想我不应该按这个顺序做。

标签: android android-recyclerview onresume notifyitemchanged


【解决方案1】:

onResume 在你去其他活动并回来之后调用,它是活动生命周期的一部分。但是 onBindViewHolder 是与适配器设计模式相关的方法,它会随着您滚动适配器生成单元格项目的位置而不断调用。因此,需要在此方法上应用任何更改,您可以使用 notifyItemChanged(position) 来触发该更改。

还有其他实现方式: 这将是一个正确的实现,要从最后选择的 RecyclerView 中删除突出显示的背景颜色,您必须在适配器项列表中保留一些属性突出显示的内容。

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()
}

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多