说我有List<User>
。现在我可以将此列表包装在ArrayAdapter中。
List<User> users = Users.getAll();
ArrayAdapter<User> = new ArrayAdapter<User>(this, android.R.layout.simple_list_item_1, users);
然后我将适配器绑定到列表视图以显示用户列表。
Users.getAll()
使用Sugar ORM查询数据库并返回用户列表。可以从显示用户列表的活动将项添加到用户列表中。我想知道如何更新列表视图。
选项1
一种方法是在我添加到数据库时手动更新users
,然后调用adapter.notifyDataSetChanged()
。这样做有效,但感觉不对,因为我正在维护一个表示数据库中的内容的“假”列表。
选项2
我想知道如果我只清除users
中的项目,使用新数据库查询的结果更新它然后调用adapter.notifyDataSetChanged()
会有多糟糕?
是否会抛弃所有子视图并重新渲染?或者是否调用equals()
方法来查看绑定到每个子节点的模型是否相同,然后仅更新新的模型?
其他信息
由于我使用的是SugarORM,我认为我无法访问Cursor以提高效率。但是,如果有更好的方法可以使列表与SugarORM同步,我也很高兴听到这一点。
答案 0 :(得分:0)
回答您的选项2:不,它不会调用equals,因为适配器与小部件一起使用以重新使用视图,它不会在列表中创建一个新视图foreach项,它会创建一个查看foreach可见项目,滚动时重新使用离开屏幕的视图。
这里最好的选择是创建一个自己的适配器,创建一个扩展BaseAdapter的类,并在其中创建自己的逻辑,重新查询数据库并通知更改列表视图(或gridview)..
另一方面,做你在这里说的话:
我想知道如果我只清除用户中的项目,用新数据库查询的结果更新它然后调用adapter.notifyDataSetChanged()会有多糟糕?
也不错。
答案 1 :(得分:0)
创建一个扩展Observable
的DAO类,然后让适配器实现Observer
。现在每次添加或删除SugarRecord时,都要通过DAO类进行操作,并且注册为Observer的任何人都将通过以下方法得到通知:
@Override
public void update(Observable observable, Object o)
您可以了解更多关于Observable / Observer模式here的信息。这只是众多示例和教程中的一个。