无法从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()也会触发空指针异常,所以要先做非空判断。
修复后的代码(二选一即可)
- 简化版:直接使用addAll替代循环
@Override protected Void doInBackground(Void... voids) { contactList1 = contactRepository.getContactsDetails(); contactarrayList = new ArrayList<>(); // 先判断列表非空,避免空指针 if (contactList1 != null) { contactarrayList.addAll(contactList1); } return null; }
- 修正循环条件
@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
相关产品推荐
相关产品推荐

