You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从Room数据库加载数据到RecyclerView,循环添加数据时崩溃

Room数据加载到RecyclerView时循环添加数据崩溃问题

我正在开发一个将Room数据库数据加载到RecyclerView的项目,在NewActivity中遇到崩溃问题——在for循环向ArrayList添加数据时应用崩溃,改用forEach循环后问题依旧。调试确认崩溃发生在循环添加数据阶段,期望能正常显示Room中已插入的数据。

相关代码

package com.app.mycontacts;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Adapter;

import com.app.mycontacts.AddContactActivity.AddContactActivity;
import com.app.mycontacts.Data.ContactDetails;
import com.app.mycontacts.Data.ContactRepository;
import com.app.mycontacts.Data.MyAdapterClass;
import com.app.mycontacts.R;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.ArrayList;
import java.util.List;

public class NewActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    RecyclerView.Adapter adapter;
    ArrayList<ContactDetails> contactarrayList;
    RecyclerView.LayoutManager layoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView= findViewById(R.id.reyclerview);

        new LoadDataTask().execute();
    }


    class LoadDataTask extends AsyncTask<Void,Void,Void> {

        ContactRepository contactRepository;
        List<ContactDetails> contactList1;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            contactRepository = new ContactRepository(getApplicationContext());
        }

        @Override
        protected Void doInBackground(Void... voids) {

            contactList1=contactRepository.getContactsDetails();
            contactarrayList= new ArrayList<ContactDetails>();

            for(int i=0; i<=contactList1.size();i++){

                contactarrayList.add(contactList1.get(i));
               
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void unused) {
            super.onPostExecute(unused);

            recyclerView.setLayoutManager(new LinearLayoutManager(NewActivity.this));

            MyAdapterClass myAdapterClass= new MyAdapterClass(NewActivity.this,contactarrayList);
            recyclerView.setAdapter(myAdapterClass);
        }
    }

}

问题分析与修复方案

崩溃的核心原因是索引越界异常(IndexOutOfBoundsException):
List的索引范围是0到size()-1,你写的循环条件i <= contactList1.size()会让i最终等于contactList1.size(),此时调用contactList1.get(i)会访问不存在的索引,直接引发崩溃。

另外需要额外注意:如果contactRepository.getContactsDetails()返回null,调用contactList1.size()也会触发空指针异常,所以要先做非空判断。

修复后的代码(二选一即可)

  1. 简化版:直接使用addAll替代循环
@Override
protected Void doInBackground(Void... voids) {
    contactList1 = contactRepository.getContactsDetails();
    contactarrayList = new ArrayList<>();
    // 先判断列表非空,避免空指针
    if (contactList1 != null) {
        contactarrayList.addAll(contactList1);
    }
    return null;
}
  1. 修正循环条件
@Override
protected Void doInBackground(Void... voids) {
    contactList1 = contactRepository.getContactsDetails();
    contactarrayList = new ArrayList<>();
    if (contactList1 != null) {
        // 把<=改成<,确保i不会超出索引范围
        for(int i=0; i < contactList1.size();i++){
            contactarrayList.add(contactList1.get(i));
        }
    }
    return null;
}

内容的提问来源于stack exchange,提问作者Ruby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:31:04