Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RecyclerView onBindViewHolder IndexOutfBounds尝试在ArrayList中绘制元素_Java_Android_Android Recyclerview - Fatal编程技术网

Java RecyclerView onBindViewHolder IndexOutfBounds尝试在ArrayList中绘制元素

Java RecyclerView onBindViewHolder IndexOutfBounds尝试在ArrayList中绘制元素,java,android,android-recyclerview,Java,Android,Android Recyclerview,我有两个Arraylists,其中一个我存储了jSONObjects,另一个jSONObjects,我试图查看第一个数组中是否包含第二个数组中的元素,然后绘制那些视图,但我得到了indexOutOfBounds异常,之所以调用这些项,是因为错误告诉我索引3,大小3是所选的元素 @Override public void onBindViewHolder(TagsViewHolder holder, int position) { if(mArrayListElemen

我有两个
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));
        }
...
如何在
mArrayListElements
中的
mArrayListSelectedTags
中绘制视图

更加一致

mArrayListElements
包含从0到15的元素,而
mArrayListSelectedTags
包含例如元素0、5、9。然后我只想从这16个
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));
        }
参考文献


感谢您收到这样的异常,因为您的阵列大小不同

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

  • getItemCount()
    方法应返回要显示的数组元素的大小
  • 比方说,您正在显示名为“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));
      }
    }
    
  • 您的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中


    顺便说一句,您应该记住,RecyclerView重用了ViewHolder,因此您需要处理这两种情况,即当两个数组都包含项目时,您需要更改视图的颜色,当只有主数组包含项目时,您需要将默认颜色设置回原处。否则,在滚动时,某些视图的背景颜色会错误。

    通过执行以下操作解决了此问题

     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));
    
            }
    
    for(int i=0;i

    谢谢大家的帮助

    你在RecyclerView中展示的是什么?您是在两个列表中存储相同的对象,还是它们是表示相同数据的不同对象?json对象是否有任何可以用作id的属性?两个列表中的对象是相同的,leys说在其中一个列表中,我有16个JSONObject,在另一个列表中,我有16个存储中的4个,我想绘制,您在RecyclerView中显示的是什么?mArrayListSelectedTags有4个元素。位置指的是recyclerview中的位置。这符合你的逻辑吗?意思是你只展示了4件物品?谢谢你!编辑我的问题NPE的答案是,您正在寻找的视图不存在。但是我建议查看此链接,它可能有助于更快地获得解决方案。您好,感谢您的回复,现在视图v为nulljava.lang.NullPointerException:尝试在null对象上调用虚拟方法“void android.View.View.setBackgroundColor(int)”,它就会抛出reference@Toddxml文件中视图的id是什么?您的代码:holder.itemView.findViewById(mArrayListElements.indexOf(mArrayListSelectedTags.get(position));不正确
    <View
    android:id="@+id/my_view"
    ...
    />
    
    holder.itemView.findViewById(R.id.my_view);
    
     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));
    
            }