2017-08-11 106 views
0

我想从我的recyclerView中的给定项目位置获取视图,但持有者始终为空,我无法弄清楚原因。Android - 持有者从recyclerView适配器项目位置返回null

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

回答

1

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

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

其次,如果您传递一个当前未在RecyclerView内布置的项目的ID,它将返回null。因此,如果您目前可以看到项目#5-#12,但是想要#ViewHolder#200,则无法工作。

+0

我已经设置selectedPostTagsAdapter.setHasStableIds(true);,但我一直持有人为空。我已经读过这个问题的第二个可能的原因,但我仍然不明白。 –

+0

您的适配器支持某种数据模型,通常是一个列表。 RecyclerView将在任何时候只显示一些数据。您的数据模型可能包含数千个项目,而RecyclerView仅显示其中的10个项目。不在屏幕上的项目的任何id将从'findViewHolderForItemId'返回null –

相关问题