【问题标题】:Android - holder returning null from recyclerView adapter item positionAndroid - 持有人从 recyclerView 适配器项目位置返回 null
【发布时间】:2017-08-11 23:37:33
【问题描述】:

我想从我的 recyclerView 中的给定项目位置获取视图,但持有人总是为空,我不知道为什么。

                        Rect toRect = new Rect();
                        selectedPostTagsAdapter.addPostTag(postTag);
                        selectedPostTagsAdapter.notifyDataSetChanged();
                        for (int i = 0; i < selectedPostTagsAdapter.getItemCount(); i++) {
                            RecyclerView.ViewHolder holder = rvSelectedPostTags.findViewHolderForItemId(selectedPostTagsAdapter.getItemId(i));
                            if (holder != null) {
                                View viewX = holder.itemView;
                                viewX.getGlobalVisibleRect(toRect);
                            }

【问题讨论】:

    标签: android android-recyclerview adapter


    【解决方案1】:

    RecyclerView.findViewHolderForItemId() 可能返回 null 有两个原因。

    首先,如果您的 RecyclerView 没有稳定的 ID,它将总是返回 null。您可以致电rvSelectedPostTags.setHasStableIds(true) 开启此功能。但是请注意,如果您想使用它,您实际上必须具有逻辑上稳定的 id。这意味着给定的数据项应始终返回相同的 id,而不管其位置如何。

    其次,如果您传递当前未在RecyclerView 中布局的项目的 id,它将返回 null。因此,如果您当前可以看到项目 #5-#12,但您想要 #200 的 ViewHolder,那么它将无法正常工作。

    【讨论】:

    • 我已经设置了 selectedPostTagsAdapter.setHasStableIds(true);,但我一直将持有者设为 null。我已经阅读了问题的第二个可能原因,但我仍然不明白。
    • 您的适配器由某种数据模型支持,通常是一个列表。 RecyclerView 在任何时候都只会显示其中的一些数据。您的数据模型可能有数千个项目,而 RecyclerView 只显示其中的十个。任何不在屏幕上的项目的 id 都会从findViewHolderForItemId返回 null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多