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

cld4siwp  于 2023-04-04  发布在  Android
关注(0)|答案(2)|浏览(143)

实际上,我想在我的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();
lokaqttq

lokaqttq1#

这里是最简单的方法
如果你想得到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);
}

编辑二:备注

这是一个已知的问题,如果你在设置列表之后调用findViewHolderForAdapterPosition,那么你会得到NullPointerException。
如果已经调用notifyDataSetChanged()但是还没有计算新布局,则该方法将返回null,因为视图的新位置在计算布局之前是未知的。
link
为了解决这个问题,你可以这样做。

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);
lkaoscv7

lkaoscv72#

经过多次尝试,我找到了一个解决方案,这是一个很简单很短很简单的行代码recyclerView.scrollToPosition(your position);

相关问题