0

我在为Android编程应用程序。我上传到GitHub:app修改数据库行后RecyclerView不会刷新

我有一个ViewPager(MainActivity.java)控制两个片段。在第一个片段(FirstFragment.java)上,您可以添加出现在RecyclerView上的People(People.java)(同样在FirstFragment.java上)。当您单击RecyclerView上的其中一个列表项目时,其详细信息(名称和ID)出现在第二个片段(SecondFragment.java)上。 SecondFragment.java还包含一个可以删除所选人员的按钮。

要存储People对象,我使用了人员列表并使用PeopleLab.java中的方法进行管理。该程序工作正常:我可以添加/删除People对象到列表中,并且它出现在RecyclerView上。
之后,我决定用数据库替换List。它只意味着创建数据库(数据库文件夹中的3个文件)并编辑PeopleLab.java中已有的和两种新的方法。其他文件保持不变。 数据库按预期工作(使用sqlite3进行检查),我可以像以前一样添加/删除People,并且查询工作正常。我唯一的问题是,这些更改不会出现在RecyclerView上。但是如果我关闭并重新打开应用程序,则会显示更改。 这就像RecyclerView不关心数据库在运行时,只有当应用程序启动(或关闭,不知道)。

你有什么想法可能导致这个问题?我唯一的猜测是我错过了Android应用程序处理数据库的方式。

小姐:对不起,我的英语。

回答

0

您在适配器上调用notifyDataSetChanged(),但不提供该适配器的任何新数据。

在你FirstFragment

private void updateUI() { 
    PeopleLab peopleLab = PeopleLab.get(getActivity()); 
    List<People> peoples = peopleLab.getPeople(); 

    if(mAdapter == null) { 
     mAdapter = new PeopleAdapter(peoples); 
     mRecyclerView.setAdapter(mAdapter); 
    } else { 
     // You actually have to change your dataset 
     mAdapter.changeDataSet(peoples); 
    } 
} 

而在你Adapter

public void changeDataSet(List<People> people) { 
    this.mPeoples = people; 
    notifyDataSetChanged(); 
} 

这一些野蛮的方式做到这一点,虽然。 最好通知您的适配器插入/删除呼叫notifyItemInserted(int itemPosition)notifyItemRemoved(int itemPosition)。 (并刷新你的数据集,顺便说一句)

+1

谢谢,它正在工作! – ftibi93

+0

不客气,玩得开心。 – Xalamadrax

0

它不会工作automatically.You既可以使用通知适配器的底层数据已更改,因此该适配器可以读取和重新加载data.It可以使用adapter.notifyDataSetChanged()

或者使用可以使用CursorLoader完成以达到相同的效果

+0

我已经使用notifyDataSetChanged()。它在按钮的onClickListener(向数据库添加新行)中调用,并且我有另一个按钮,只有目的是调用它。 – ftibi93