【问题标题】:RecyclerView - findViewHolderForAdapterPosition() returns null for invisible itemsRecyclerView - findViewHolderForAdapterPosition() 为不可见的项目返回 null
【发布时间】:2016-10-20 19:05:37
【问题描述】:

我正在尝试更新RecyclerView 项目点击的所有视图。我尝试findViewHolderForAdapterPosition() 来获取ViewHolder,但它返回null 以获得不可见的项目。我知道如果视图尚未准备好,该方法可以返回null,如果列表很大,更新其他不可见列表不是一个明智的主意。但是,我的列表非常小(总是少于 10 个),我想在单击项目时访问视图/视图持有者。

我正在使用以下代码来更新 ViewHolders

        for (int i = 0; i < itemsList.size(); i++) {
            if (i != getAdapterPosition()) {

                MyViewHolder temp = (MyViewHolder) recyclerView.findViewHolderForAdapterPosition(i);

                if (temp != null) {
                    //update elements
                } else {
                    Log.i(TAG, "temp is null");
                }


            }
        }

任何帮助或线索将不胜感激。

【问题讨论】:

  • 我想没有解决方法,因为使用这种方法是不安全的。不能保证此时您调用该方法时视图已准备就绪。您应该在适配器内实现项目点击,而不是在活动中。
  • @Opiatefuchs,是的,我在适配器中使用点击监听器。问题是,我无法访问不可见列表项的 ViewHolders。

标签: java android android-layout android-recyclerview


【解决方案1】:

我想在单击项目时访问视图/查看器。

您可以通过在适配器的 onBindViewHolder() 方法内对任何视图设置 onClickListener 来简单地实现此功能。

用于将项目上的点击事件分派给活动或片段进行处理:

1- 在您的适配器类中,定义一个名为 OnItemClickListener 的接口:

public interface OnItemClickListener {
     void onItemClicked(int position, AnyOtherDataYouWant data)
}

2- 让你的 Activity 或 Fragment 实现这个接口

public MyActivity extends AppCompatActivity implements MyAdapter.OnItemClickListener

3- 将OnItemClickListener 接口类型的引用传递给constructor of your adapter 并将其保存在一个名为listListener 的字段中。

4- 在适配器的onBindViewHolder 中,在您想要的视图上,例如按钮或文本视图:

holder.myview.setOnClickListener(new View.OnClickListener()
{
     @Override
     public void onClick(View view)
    {
         listListener.onItemClicked(position, AnyDataYouWant data) ;
    }
}) ;

【讨论】:

  • 感谢您的回答。但这并不完全是我需要的。我需要的是在单击项目时更新所有列表项。例如,您有一个列表,您需要在单击项目时显示检查图像。但是,您需要取消选中其他列表,以便仅显示一项检查。
  • 更简单。您应该跟踪已选中项目在适配器中的位置,并在单击项目时调用 adapter.notifyDatasetChanged()。 @AjmalSalim
  • 另外,在你的 onBindViewHolder 中,检查当前位置是否等于保存的检查位置,例如调用 setChecked(true)。
  • 这实际上是错误的,因为你强迫他们所有人都活在记忆中,这与 viewholder 模式背后的整个想法背道而驰。
  • 您管理已检查项目状态的方式有问题。您可以在提供更多代码的同时编辑您的问题,以便我们了解真正的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多