调用片段时出现ArrayIndexOutOfBoundsException

时间:2017-11-10 16:38:13

标签: java android android-fragments exception adapter

我有一个嵌套的recyclerview&在嵌套的回收器中实现OnClickListener()并在其单击时替换片段。在第一个回收商的onBindViewHolder我根据从服务器获得的数据设置新的适配器。

  1. 如果数据保持类型Category设置类别适配器
  2. 如果数据保持类型Item设置项适配器
  3. 以下是我如何设置

    的代码
    if (myCategoryList.size() > 0 && isCategory) {
                categoryAdapter = new CategoryAdapter(myCategoryList);
                holder.recyclerView.setAdapter(categoryAdapter);
                isCategory = false;
            } else {
                if (myItemListOfList.size() > 0) {
                    if (myCategoryList.size() > 0) {
                        itemAdapter = new ItemAdapter(myItemListOfList.get(position - 1));
                        holder.recyclerView.setAdapter(itemAdapter);
                    } else {
                        itemAdapter = new ItemAdapter(myItemListOfList.get(position));
                        holder.recyclerView.setAdapter(itemAdapter);
                    }
                }
            }
    

    当我运行程序时,一切正常。当我点击view类型的Category时,它也可以正常工作。但是,当我点击类型为view的{​​{1}}时,它会成功打开下一个片段,当我按下后退按钮时会出现问题,它会将我带到上面代码所在的上一个片段。然后Item没有执行,所以我在上面的代码中代码为if statement的行上显示ArrayIndexOutOfBoundsException

    所以我想知道为什么在position - 1的背面按下if语句没有执行以及为什么它在Item Fragment的背面按下执行。

    Category Fragment是全局变量,默认情况下为true。我也尝试在构造函数中将其设置为true,但问题是相同的。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

问题必须在这里。 position的值必须保持一些意外的值。

itemAdapter = new ItemAdapter(myItemListOfList.get(position - 1));

你能改变你的代码并尝试一次

if (myCategoryList.size() > 0 && isCategory) {
            categoryAdapter = new CategoryAdapter(myCategoryList);
            holder.recyclerView.setAdapter(categoryAdapter);
            isCategory = false;
        } else {
            if (myItemListOfList.size() > 0 &&  position <= myItemListOfList.size()-1 ) {
                if (myCategoryList.size() > 0) {
                    position = ((position -1) < 0 ? 0 : position-1);
                    itemAdapter = new ItemAdapter(myItemListOfList.get(position));
                    holder.recyclerView.setAdapter(itemAdapter);
                } else {
                    itemAdapter = new ItemAdapter(myItemListOfList.get(position));
                    holder.recyclerView.setAdapter(itemAdapter);
                }
            }
        }