Recyclerview arraylist在android中抛出一个outofbounds异常

时间:2017-03-04 17:03:00

标签: android arraylist android-recyclerview indexoutofboundsexception

我的回收者视图存在问题,或者更准确地说是使用二级arraylist来设置每个视图中的值。

我有一个发送到我的适配器的项目列表,在它的构造函数中,我创建了一个这个列表大小的arraylist。项目的arraylist正常工作,但包含所有项目的整数的第二个arraylist表示outofbounds。快速记录显示情况并非如此,并且有一个1的列表,但每次我尝试在索引0处访问它的outofbound。

Class def

RecyclerView recyclerView;
ItemAdapter itemAdapter;
List<Item> items;
List<Boolean> itemsSelected;
List<Integer> quantities;

的OnCreate

  quantities = new ArrayList<>();

为适配器创建项目列表的方法,并创建1的等长列表

 for (int i = 0; i <categories.size() ; i++) {
               long length =  dataSnapshot.child(categories.get(i)).getChildrenCount();
              Iterator<DataSnapshot> toAdd= dataSnapshot.child(categories.get(i)).getChildren().iterator(); // this returns all the items in each category
                for (int j = 0; j <length ; j++) {
                    DataSnapshot newData = toAdd.next();
                    items.add(newData.getValue(Item.class));
                    //quantities.add(Integer.valueOf(1));
                    //itemsSelected.add(Boolean.valueOf(false));
                    Log.d(TAG, "onDataChange: debug: "+ newData.toString());

                }


            }
            for (int i = 0; i < items.size() ; i++) {
                quantities.add(i,Integer.valueOf(1));
                itemsSelected.add(i,Boolean.valueOf(false));
            }
            itemAdapter = new ItemAdapter(items);
            itemAdapter.notifyDataSetChanged();

在上面的代码中,注释掉的两行是另一个创建一个列表的尝试,但它也有相同的错误,所以我把它移到了一堆其他地方。

我也在适配器构造函数

中执行相同的操作
 public ItemAdapter(List<Item> items){
        this.items = items;
        for (int i = 0; i < items.size() ; i++) {
            quantities.add(i,Integer.valueOf(1));
            itemsSelected.add(i,Boolean.valueOf(false));
            Log.d(TAG, "ItemAdapter: quan "+ quantities.get(i));
            Log.d(TAG, "ItemAdapter: bool "+ itemsSelected.get(i));
        }

记录显示展示位置 典型的日志输出

ItemAdapter: quan 1
bindItem: quan [1, 1, 1, 1, 1, 1, 1, 1]

我做错了什么。即使绑定项目时该列表也存在,因为如果我记录整个列表而不是单个索引,则输出整个列表但是get(index)会导致outofbounds。

感谢您抽出时间来研究这个问题。

编辑:适配器代码

 private class ItemAdapter extends RecyclerView.Adapter<ItemHolder>{
    List<Item> items;
    Item item;

    public ItemAdapter(List<Item> items){
        this.items = items;
        for (int i = 0; i < items.size() ; i++) {
            quantities.add(i,Integer.valueOf(1));
            itemsSelected.add(i,Boolean.valueOf(false));
            Log.d(TAG, "ItemAdapter: quan "+ quantities.get(i));
            Log.d(TAG, "ItemAdapter: bool "+ itemsSelected.get(i));
        }
    }

    @Override
    public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
        View view= layoutInflater.inflate(R.layout.singleitem,parent,false);
        return new ItemHolder(view);
    }

    @Override
    public void onBindViewHolder(ItemHolder holder, int position) {
        item = items.get(position);
        holder.bindItem(item,position);
    }

    @Override
    public int getItemCount() {
        return items.size();
    }


}

1 个答案:

答案 0 :(得分:0)

您如何访问适配器中的quantities列表?

解决这个问题的一种方法是将数量列表传递给适配器的构造函数,然后在向两个列表添加值之后调用notifyDataSetChanged()方法(记住添加&amp;不重置列表)。这将确保使用适配器更新两个列表。

只是一个小疑问。为什么要在构造函数中设置for循环。你打算做什么?