如何将更改应用于RecyclerView的每个ViewHolder,即使是那些没有显示的



我有一个RecyclerView。RecyclerView中的每个ViewHolder都包含两个元素,我想在调用方法时将其可见性设置为GONE。我要做的是等待RecyclerView使用RecyclerView.getViewTreeObserver((.addOnGlobalLayoutListener((完成布局,更改每个项目的可见性,然后删除GlobalLayoutListener。这是我代码的一部分:

public void deselectMessages() {
recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
for (int i = 0; i < messages.size(); i++) {
recyclerView.findViewHolderForAdapterPosition(i).itemView.findViewById(R.id.frame_layout_selected).setVisibility(View.GONE);
recyclerView.findViewHolderForAdapterPosition(i).itemView.findViewById(R.id.selected_button).setVisibility(View.GONE);
}
recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
}

我得到以下错误:

java.lang.NullPointerException: Attempt to read from field 'android.view.View androidx.recyclerview.widget.RecyclerView$ViewHolder.itemView' on a null object reference

我该怎么做才能让它发挥作用?

我想,也许我无法修改当前未显示的ViewHolders。但问题是,当我滚动到这些视图时,这些ViewHolder的元素的可见性设置为VISIBLE。如果我不修改当前不在屏幕上的视图的可见性,当我滚动到这些视图时,ViewHolder的元素的可见性将设置为VISIBLE。我该怎么办?顺便说一句,当调用deselectMessages((方法时,我可以通过代码修改xml文件中的可见性。

不能保证RecyclerView会返回给定位置的ViewHolder。RecyclerView只创建一些足以填充RecyclerView的ViewModel,而创建一些缓冲区模型。您需要做的基本上是在适配器中维护一个状态对象。然后,该适配器可以在onBindViewHolder函数中根据您的需要使用此状态信息来呈现/更新项。

在您的情况下,您可以保留一个HashSet flagedItems。并保留要以不同方式显示的元素的位置或ID。如果更新此集,请确保在适配器中调用notifyDataSetChanged。适配器将确保更新的项目。所有决定项目外观的逻辑都应该放在BindViewHolder上。

相关内容

  • 没有找到相关文章

最新更新