0

中抛出异常异常我的回收视图存在问题,或者更准确地说是使用次级ArrayList用于在每个视图中设置值。Recyclerview ArrayList在Android

我有一个项目列表发送到我的适配器,并在其构造函数中创建列表的大小列表。项目的数组列表正常工作,但包含所有数字的整数列表中的第二个数组列表说明了outofbounds。快速的logD显示,多数民众赞成并非如此,有1的有名单,但每次我试图在索引0

级高清

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

的OnCreate

quantities = new ArrayList<>(); 
访问此其outofbounds

创建适配器的项目列表的方法并且还创建等于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)); 
     } 

相同LOGD显示位置 典型日志输出

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


} 
+0

你可以发布你的适配器代码 – MadScientist

+0

只是为你添加它 – ah4444

回答

0

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

解决这个可以通过工程量清单到适配器的构造函数,然后调用notifyDataSetChanged()方法,增加值,这两个列表(记得加入&不是正在重置列表)后的一种方式。这将确保这两个列表都使用适配器进行更新。

只是一个小小的怀疑。你为什么要在构造器中设置for循环。你打算实现什么?

+0

嗨谢谢你的答案。 For循环在那里,因为我一直在尝试找出什么是错的。它应该将数量设置为项目列表的确切长度。我在适配器中通过在片段类中声明数量来访问数量。我会尝试先创建两个列表的解决方案,然后将它们传递给适配器,并返回给您结果,尽管我认为之前曾尝试过。原因是因为当我突出显示在视图中的项目与该视图的所有相应的项目是突出显示,所以即时通讯尝试跟踪这些列表 – ah4444

+0

它其他视图点亮。那么这与你的名单无关。检查[this](http:// stackoverflow。com/questions/34552070/dynamic-adding-views-in-a-recyclinglerview-only-to-current-item/42482524#42482524)stack post! – MadScientist

+0

嗨,感谢您的帮助。我通过在同一个地方创建它们并将它们传入到适配器中,将其列入适配器。至于其他视图,我检查了链接,但最终以这种方式继续。列表的目的是跟踪已选择的内容,以便当我上下滚动时,选择仍然存在。不能确定如果onViewRecycled将持续 – ah4444