【问题标题】:Prevent ArrayIndexOutOfBoundsException when adding items after adapter is set在设置适配器后添加项目时防止 ArrayIndexOutOfBoundsException
【发布时间】:2025-11-28 06:10:01
【问题描述】:

这是我的onBindViewHolder 代码:

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {       
        myHolder = holder;
        text = mDataset.get(keys[position]);            
        myHolder.singleItemTextView.setText(text);

}

这是我将数据添加到 RecyclerView 的代码:

    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    myDataset = new LinkedHashMap<>();


    mAdapter = new HashMapAdapter(myDataset);
    mRecyclerView.setAdapter(mAdapter);


    myDataset.put("1", "Hello");
    myDataset.put("2", "World");
    mAdapter.notifyDataSetChanged();

上面的代码不起作用,我得到java.lang.ArrayIndexOutOfBoundsException: length=0; index=0。但是当我在使用setAdapter(mAdapter) 之前将数据放入时,一切正常:

    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    myDataset = new LinkedHashMap<>();

    myDataset.put("1", "Hello");
    myDataset.put("2", "World");

    mAdapter = new HashMapAdapter(myDataset);
    mRecyclerView.setAdapter(mAdapter);

如何先设置适配器,然后添加项目而不会出现此错误?我需要它,因为我动态添加项目,起初数据集是空的,所以我设置了一个带有空数据集的适配器。

【问题讨论】:

  • myDataset 是托管数据,但您使用position 来索引一些keys 数组。您需要展示如何管理该阵列 - 将此答案用作指南:*.com/a/5234718/2711811

标签: android android-recyclerview


【解决方案1】:

如果您知道自己将遇到错误(在这种情况下是异常),您应该使用 try and catch 块来捕获异常。这样,您将能够正常继续,因为您的应用程序不会因异常而崩溃。

try{
    mAdapter = new HashMapAdapter(myDataset);
    mRecyclerView.setAdapter(mAdapter);
}catch(ArrayIndexOutOfBounds ex){
    Log.e(TAG, "Exception: " + ex);
}

您也许可以从根本上解决问题。我相信在适配器类中设置位置时会遇到异常,如果arrayList为空,它将遇到ArrayIndexOutOfBounds。作为异常统计java.lang.ArrayIndexOutOfBoundsException: length=0; index=0,这意味着当数组的大小/长度为 0 时,您正在尝试访问位置 1(索引 = 0)。您正在尝试访问不存在的东西。

解决这个问题的另一种方法是在访问数组之前检查索引是否在数组的范围内(在 0 和数组长度减 1 之间)。例如:

if( index >= 0 && index < array.length){
    //safe to access the array
} else {
   //not safe to access the array as you'll encounter exception
}

【讨论】: