Android recyclerView findViewHolderForAdapterPosition 返回 null

标签 android android-recyclerview

我想以编程方式单击 recyclerView 中的一个项目,我发现 a way这样做:

recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick();

但这对我不起作用,findViewHolderForAdapterPosition 只返回 null。

我是否遗漏了代码中的某些内容?

HistoryListAdapter:

public class HistoryListAdapter extends RecyclerView.Adapter<HistoryListAdapter.ViewHolder> {
private static ArrayList<RecordItem> recordItems;
private static FragmentActivity activity;
private static RecordList recordList;

public HistoryListAdapter(ArrayList<RecordItem> recordItems, FragmentActivity FA, RecordList FRL) {
    this.recordItems = recordItems;
    this.activity = FA;
    this.recordList = FRL;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recorditem, parent, false);
    return new ViewHolder(itemLayoutView);
}

@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
    // TextView setText ...
}

// Return the size of the itemsData (invoked by the layout manager)
@Override
public int getItemCount() {
    return recordItems.size();
}

// inner class to hold a reference to each item of RecyclerView
public static class ViewHolder extends RecyclerView.ViewHolder{
    public TextView result, datetime;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        itemLayoutView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (activity != null) {
                    // do something...
                }
            }
        });
        result = (TextView) itemLayoutView.findViewById(R.id.result);
        heartrate = (TextView) itemLayoutView.findViewById(R.id.heartrate);
        datetime = (TextView) itemLayoutView.findViewById(R.id.datetime);
    }
}
}

记录列表:

RecyclerView listView = (RecyclerView) layoutView.findViewById(R.id.listView);
HistoryListAdapter listadapter = new HistoryListAdapter(itemsToShow, getActivity(), RecordList.this);
listView.swapAdapter(listadapter, false);
listView.findViewHolderForAdapterPosition(0).itemView.performClick();

我省略了一些代码,但应该不会影响我代码的整体结构。

最佳答案

根据official documentation :

if notifyDataSetChanged() has been called but the new layout has not been calculated yet, this method will return null since the new positions of views are unknown until the layout is calculated.

使用 findViewHolderForAdapterPosition() 是不安全的。

当您在 listView.swapAdapter(listadapter, false); 之后调用此方法时,您将始终得到一个 null 作为结果,因为 notifyDataSetChanged() 将被调用。

关于Android recyclerView findViewHolderForAdapterPosition 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32836844/

相关文章:

android - 如何在 RecyclerView 中使用 ItemAnimator?

android - 使用 AsyncTask 将图像加载到自定义适配器中

android - 在回收站 View 中发生删除动画时如何隐藏分隔线

android - 升级到 Lollipop 后 Adb 未检测到设备(Sony Xperia Z3)

android - 引用错误 : Camera Is Not Defined

android - RecyclerView 适合屏幕时不要折叠 Toolbar

android - 键盘关闭时 Recyclerview 崩溃

android - RecyclerView ViewPager java.lang.NullPointerException android.support.v7.widget.RecyclerView$ItemAnimator$ItemHolderInfo.left

javascript - 如何在Android浏览器中检测鼠标点击并按住?

java - 无法将收到的短信文本与 Android 中的值进行比较