RecyclerView onBindViewHolder indexOutOfBounds试图在ArrayList中绘制元素

问题描述 投票:0回答:2

我有两个Arraylists,其中一个我存储了jSONObjects而另一个JSONObjects,我试图看看是否在第一个数组中它包含第二个中的元素然后绘制这些视图但我得到了indexOutOfBounds异常,这些项目是beign调用,因为错误告诉我索引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));
        }
...

如何在mArrayListSelectedTags中绘制mArrayListElements中的视图?

更加一致

mArrayListElements具有从0到15的元素,并且mArrayListSelectedTags具有例如元素0,5,9。然后我只想绘制那些mArrayListElements正在展示的那些元素中的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

参考

谢谢

java android android-recyclerview
2个回答
1
投票

您收到此类异常,因为您的数组具有不同的大小。

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

  1. getItemCount()方法应该返回数组的大小,要显示的元素。
  2. 可以说,您正在显示名为“mArrayListElements”的数组中的项目。试试这段代码: @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)); } }
  3. 在这行代码中,您的ID存在问题: holder.itemView.findViewById(mArrayListElementos.indexOf(mArrayListSelectedTags.get(i)));

您有两种方法可以解决它。

第一。 如果需要更改整个视图背景的颜色,可以使用:

holder.itemView.setBackgroundColor(mContext.getResources().getColor(R.color.colorVincular));

第二。 如果需要更改视图某些部分的颜色,则需要在xml文件中将id设置为视图(要更改),然后在方法findViewById(R.id.YOUR_ID)中使用该id。

例如: 在xml中

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

在代码中

holder.itemView.findViewById(R.id.my_view);

附:顺便说一下,你应该记住,RecyclerView重用ViewHolders所以你需要处理这两种情况,当你需要在两个数组都包含你的项目时改变视图的颜色,并设置默认颜色,当只有主数组包含项目时。否则,在滚动时,您会看到一些颜色错误的视图背景。


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

        }

谢谢大家的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.