RecyclerView不显示SQLite数据,新增内容需重启才生效
问题根源与解决方案
你的核心问题是新增数据后没有主动触发RecyclerView的数据源刷新,再加上几处代码小问题,导致新添加的内容只能在重启APP后才会显示。下面我一步步拆解问题并给出修复方案:
1. 核心问题:列表片段未在返回时重新加载数据
你的preparePeopleData()方法只在片段初始化时执行了一次,当你从Add_New_Person页面返回后,这个方法并没有被再次调用——RecyclerView还是拿着旧的数据源自然看不到新内容。
2. 次要问题:数据源未清空导致重复叠加
就算你重新调用加载方法,每次加载前不清空PeopleList的话,旧数据会和新数据重复叠加,后续会出现显示混乱的问题。
3. 隐藏bug(不影响实时更新,但会破坏数据正确性)
- 在
DatabaseHandler的getAllPeople()里,newPerson.setmTwitterId(cursor.getString(2));索引错误:twitter_id是第4列(索引从0开始),应该用cursor.getString(3)。 - 在
Add_New_Person的onOptionsItemSelected方法中,if语句没加大括号,导致只有userName赋值在判断逻辑内,其余代码不管点击的是不是done按钮都会执行,容易引发意外错误。
具体修复步骤
步骤1:修改preparePeopleData(),添加清空逻辑
每次加载新数据前先清空旧列表,避免重复:
private void preparePeopleData() { DatabaseHandler databaseHandler = new DatabaseHandler(this.getContext()); List<New_Person_data> peopleArrayList = databaseHandler.getAllPeople(); // 先清空旧数据源,避免重复添加 PeopleList.clear(); for (New_Person_data newPerson : peopleArrayList) { People people = new People(newPerson.getmUserName()); PeopleList.add(people); } Log.d("Peple Array size ", String.valueOf(peopleArrayList.size())); // 排序 Collections.sort(PeopleList, new Comparator<People>() { @Override public int compare(People lhs, People rhs) { return lhs.getPerson().compareTo(rhs.getPerson()); } }); // 通知Adapter数据更新 mAdapter.notifyDataSetChanged(); }
步骤2:在列表片段的onResume()中触发数据刷新
当你从添加页面返回时,onResume()会自动触发,此时重新加载数据就能实时显示新增内容:
@Override public void onResume() { super.onResume(); preparePeopleData(); }
步骤3:修复DatabaseHandler的索引错误
修正twitter_id的赋值索引:
// 原错误代码:newPerson.setmTwitterId(cursor.getString(2)); newPerson.setmTwitterId(cursor.getString(3));
步骤4:修复Add_New_Person的if语句块
给if逻辑加上大括号,确保只有点击done按钮时才执行添加操作:
@Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); New_Person_data new_person_data; if(itemId == R.id.new_person_done) { userName = mUserName.getText().toString(); facebookId = mFacebookId.getText().toString(); twitterId = mTwitterId.getText().toString(); new_person_data = new New_Person_data(userName,facebookId,twitterId); databaseHandler.addNewPerson(new_person_data); getActivity().finish(); } return true; }
完成以上修改后,你添加完数据返回列表页面时,RecyclerView就会自动刷新并显示最新内容了。
内容的提问来源于stack exchange,提问作者LCTS
相关产品推荐
相关产品推荐

