Android RecyclerView findViewHolderForAdapterPosition()返回null,即使关联的行没有';没有回收

Android RecyclerView findViewHolderForAdapterPosition()返回null,即使关联的行没有';没有回收,android,android-recyclerview,Android,Android Recyclerview,我正在使用来自androidx的RecyclerView(请参阅) 我发现当我的RecyclerView的一行滚动到屏幕外时,关联位置的RecyclerView.findViewHolderForAdapterPosition()返回null(如预期) 但不可预料的是,相关行尚未被回收。我通过重写RecyclerView.Adapter.onViewRecyclerated()并查看回收的内容来检查这一点 那么,对于未回收的行,为什么会返回一个nullViewHolder 一个相关的问题是:我如

我正在使用来自androidx的
RecyclerView
(请参阅)

我发现当我的
RecyclerView
的一行滚动到屏幕外时,关联位置的
RecyclerView.findViewHolderForAdapterPosition()
返回
null
(如预期)

但不可预料的是,相关行尚未被回收。我通过重写
RecyclerView.Adapter.onViewRecyclerated()
并查看回收的内容来检查这一点

那么,对于未回收的行,为什么会返回一个
null
ViewHolder

一个相关的问题是:我如何找到那些尚未回收的行(除了自己使用
onViewRecycled()
保存一个列表之外)

我使用的相关代码如下:

在我的
活动中

// find the row (ViewHolder) for row with specified 'tag'
int position = customAdapter.getPositionForTag(tag);
ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(position);
// viewHolder above is null even if the associated row (with same 'tag') hasn't been recycled yet
在我的
CustomAdapter
中,它扩展了
RecyclerView.Adapter

int getPositionForTag(String tag) {
    for (int i = 0; i < dataSet.size(); i++) {
        if (dataSet.get(i).getTag().equals(tag)) {
            return i;
        }
    }
    return -1;
}

@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
    // here I monitor which rows are recycled
    // I add the 'tag' to the ViewHolder as a convenience, when binding ViewHolder (see below)
    Log.d(TAG, "onViewRecycled for tag: " + holder.tag);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    // add tag to holder as a convenience...
    holder.tag = dataSet.get(position).getTag();
    // ... now setup and add views to holder
}
int-getPositionForTag(字符串标记){
对于(int i=0;i
即使viewholder没有被回收,它可能已经被拆下了-请参见。@Pawel yes,看起来您是对的。分离但尚未回收。那么,我问的相关问题(稍微重新措辞)如何:如何找到尚未分离(或回收)的行(对于我的示例中的特定
标记)?请随意添加答案(即使是您已经回答的问题的第一部分),我可以将其标记为正确。谢谢。@Pawel在我的例子中,我试图解决的问题是,被分离(但尚未回收)的行重新出现在视图中,它们似乎将其以前的状态(特别是UI控件的状态,如复选框等)带回来。。。我需要调用一个函数来更改所有仍然(或可能仍然变为“活动”的UI控件的状态。。。但是,即使是顶级容器视图上的
findViewById()
也找不到这些“分离但未回收”的视图。如果数据集发生更改,并且需要更新已“布局”的viewholder的状态,则应向适配器发送一个,该适配器将安全地将其交付给
onBindViewHolder(VH保持架,内部位置,列出有效载荷)
或放弃它(如果
位置的viewholder未绑定)。不建议通过在视图层次结构中爬行直接操作viewholder。在不更新有效载荷的情况下进行更改被视为“项目已替换”所以当新的WEWHOLD放在这个位置时,它是被期待的。如果你不知道要更新哪些项目,考虑使用。