RecyclerView onBindViewHolder indexOutOfBounds尝试绘制ArrayList中的元素

时间:2018-09-18 20:57:46

标签: java android android-recyclerview

我有两个Arraylists,在其中一个中,我存储了jSONObjects,在另一个JSONObjects中,我试图查看是否在第一个数组中包含了在第二个元素中绘制元素,然后绘制这些视图,但是我遇到indexOutOfBounds异常,该项目被良性调用,因为该错误告诉我索引3,大小3是选定的元素。

 @Override
    public void onBindViewHolder(TagsViewHolder holder, int position) {

        if(mArrayListElements.contains(mArrayListSelectedTags.get(position))){
            View v = holder.itemView.findViewById(mArrayListElements.indexOf(mArrayListSelectedTags.get(position)));
            v.setBackgroundColor(mContext.getResources().getColor(R.color.colorVincular));
        }
...

如何绘制mArrayListSelectedTagsmArrayListElements内部的视图?

保持一致

mArrayListElements具有从0到15的元素,而mArrayListSelectedTags具有例如元素0,5,9。然后我只想从mArrayListElements显示的那16个元素中绘制这3个元素

编辑:我这样做是为了根据数组的项目位置创建视图

for (int i = 0; i < mArrayListElementos.size(); i++) {
                View v = holder.itemView.findViewById(mArrayListElementos.indexOf(mArrayListSelectedTags.get(i)));
                v.setBackgroundColor(mContext.getResources().getColor(R.color.colorVincular));
        }

但是现在我得到了

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setBackgroundColor(int)' on a null object
     

参考

谢谢

2 个答案:

答案 0 :(得分:1)

由于数组的大小不同,您会收到此类异常。

是否要显示所有元素,但仅突出显示两个数组包含的那些元素? 如果是这样,您应该:

  1. -方法应返回要显示其元素的数组的大小。
  2. 可以说,您正在显示名为“ mArrayListElements”的数组中的项目。 尝试以下代码:

    getItemCount()
  3. 在以下代码行中,您的ID出现问题:

    @Override
    public void onBindViewHolder(TagsViewHolder holder, int position) {
      if(mArrayListSelectedTags.contains(mArrayListElements(position))){
        View v = holder.itemView.findViewById(YOUR_VIEW_ID);
        v.setBackgroundColor(mContext.getResources().getColor(R.color.colorVincular));
      }
    }
    

您有两种解决方法。

首先。
 如果您需要更改整个视图的背景颜色,则可以使用:

 holder.itemView.findViewById(mArrayListElementos.indexOf(mArrayListSelectedTags.get(i)));

第二。
如果需要更改视图某些部分的颜色,则需要在xml文件中将ID设置为要更改的视图,然后在方法holder.itemView.setBackgroundColor(mContext.getResources().getColor(R.color.colorVincular)); 中使用该ID。

例如:
在xml

findViewById(R.id.YOUR_ID)

在代码中

<View
android:id="@+id/my_view"
...
/>

P.S。顺便说一句,您应该记住,RecyclerView重用ViewHolders,因此当两个数组都包含您的项目时需要为视图更改颜色时,并且当仅主数组包含item时将默认颜色设置回去时,您需要处理两种情况。 。否则,在滚动时,某些视图的背景将以错误的颜色上色。

答案 1 :(得分:0)

通过解决问题

 for (int i = 0; i < mArrayListSelectedTags.size(); i++) {
           View v = holder.itemView;
           v.findViewById(mArrayListElementos.indexOf(mArrayListSelectedTags.get(i)));
           v.setBackgroundColor(mContext.getResources().getColor(R.color.colorVincular));

        }

谢谢大家的帮助!