如何获取RecyclerView中特定项的视图?

4

实际上,我想在我的fragment.class中获取RecyclerView中特定项目的视图。为此,我尝试在我的adapter类中设置一个getter,然后尝试在我的fragment中访问它,但我无法访问这些视图。

适配器类代码:

private List<ViewHolder> holder_list=new ArrayList<>();
 @Override
public void onBindViewHolder(ViewHolder holder, int position) {

    holder_list.add(holder);
   }
public ViewHolder getViewHolder(int position){
    return holder_list.get(position);
}

片段代码:

MessageAdapter.ViewHolder holder= msgAdp.getViewHolder(msgAdp.getItemCount()-1);
    //Here holder.mMessageView is a text view
Toast.makeText(ctx,holder.mMessageView.getText().toString(),Toast.LENGTH_SHORT).show();

你可以使用接口作为回调到你的Fragment中,就像这个链接中所示:https://antonioleiva.com/recyclerview-listener/ - Raghunandan
看答案啊,伙计。 - Khemraj Sharma
2个回答

9

以下是最简单的方法:

如果您想获取项目的ViewHolder。

RecyclerView.ViewHolder viewHolder = rvList.getChildViewHolder(rvList.getChildAt(0));

或者,如果您想获取项目的View对象。
View view = rvList.getChildAt(0);

选择你需要的,你可以获取视图或者ViewHolder。你可以按照自己的需要进行操作。

编辑:

getChildAt方法是可靠的,因为我也有时遇到问题,可能还没有修复。

你可以使用以下代码

RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder)
recyclerView.findViewHolderForAdapterPosition(position);
if (null != holder) {
   holder.itemView.findViewById(R.id.xyz).setVisibility(View.VISIBLE);
}

编辑2:注意

如果在设置列表后立即调用findViewHolderForAdapterPosition,则会出现空指针异常,这是已知的问题。

如果已调用notifyDataSetChanged()但尚未计算新布局,则此方法将返回null,因为在计算布局之前,视图的新位置是未知的。

链接

为解决此问题,您可以这样做。

recyclerView.postDelayed(new Runnable() {
            @Override
            public void run() {
                RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder)
                recyclerView.findViewHolderForAdapterPosition(position);
                if (null != holder) {
                    holder.itemView.findViewById(R.id.xyz).setVisibility(View.VISIBLE);
                }
            }
        }, 50);

先生,非常感谢您的答复,但我仍然无法按您的方法访问该视图。 我收到了nullPointerException错误。 - anonymous
你正在使用哪种方法?请粘贴您的异常信息,以便我能够确定问题所在。 - Khemraj Sharma
View view = rView.getChildAt(0); RelativeLayout rl=view.findViewById(R.id.socListContainer); rl.setVisibility(View.GONE);错误指向了rl这一行。在这里,rl是容器。 - anonymous
如果你遇到了空指针异常,那么你应该再次检查你的视图ID和列表,看看该位置是否存在。你能告诉我在你的代码中是什么为空吗? - Khemraj Sharma
holder.itemView.findViewById(R.id.xyz).setVisibility(View.VISIBLE); 这行代码被指定为 nullpointerexception,顺便说一下,ID 是正确的,我已经检查了两次。 - anonymous
1
欢迎,伙计,这是我的热情。 - Khemraj Sharma

0

经过多次尝试,我找到了一个非常简单和短小的解决方案。 非常简单的一行代码 recyclerView.scrollToPosition(你的位置);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接