java - RecyclerView onBindViewHolder indexOutOfBounds 尝试在 ArrayList 内绘制元素

标签 java android android-recyclerview

我有两个Arraylists,其中一个我存储了jSONObjects,另一个JSONObjects也存储了,我正在尝试看看第一个数组中是否包含第二个数组中的元素,然后绘制这些 View ,但我收到 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 内的 View ?

更加一致

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

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

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

reference

谢谢

最佳答案

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

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

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

有两种方法可以解决这个问题。

首先。
如果你需要改变整个 View 的背景颜色,你可以使用:

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

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

例如:
在 XML 中

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

在代码中

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

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

关于java - RecyclerView onBindViewHolder indexOutOfBounds 尝试在 ArrayList 内绘制元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52394498/

相关文章:

java - 使用 Set 而不是 List 时出现 JsonMappingException

java - 更新查询返回没有更新的列

java - 如何将 appium 服务器日志从 eclipse 控制台跳过到 txt 文件

使用nexus 7从相机进行的Android视频记录返回空数据

Android Tab下划线颜色不变

android - 将 RecyclerView 与来自 LoaderManager 的数据一起使用

android - 每次更新 firebase 数据库数据时都会加载 RecyclerView 适配器

android - RecyclerView取消选择之前选择的复选框

java - 在运行时加载驱动程序 jar 文件导致 Perm Gen Space Error

android - 将屏幕截图上传到 Google Play 时出错