0

说我有一个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

一种方法是手动更新usersas a 我添加到数据库中,然后调用adapter.notifyDataSetChanged(). 这可行,但感觉不对,因为我正在维护一个代表数据库中内容的“假”列表。

选项 2

我想知道如果我只是清除其中的项目users,用新的数据库查询的结果更新它然后调用它有多糟糕adapter.notifyDataSetChanged()

是否会丢弃所有子视图并重新渲染?还是它调用该equals()方法来查看绑定到每个孩子的模型是否相同,然后只更新新的?

其他信息

由于我使用的是 SugarORM,我认为我无法访问 Cursor 来做更有效的事情。但是,如果有更好的方法使列表与 SugarORM 保持同步,我也很高兴听到。

4

2 回答 2

0

回答您的选项2:不,它不调用equals,因为适配器与小部件一起工作以重新使用视图,它不会为列表中的每个项目创建一个新视图,它会为每个可见的项目创建一个视图项目并在您滚动时重新使用离开屏幕的视图。

这里最好的选择是创建自己的适配器,创建一个扩展 BaseAdapter 的类,并在其中创建自己的逻辑,重新查询数据库并将更改通知给列表视图(或网格视图)。

另一方面做你在这里说的:

我想知道如果我只是清除用户中的项目,用新的数据库查询的结果更新它,然后调用 adapter.notifyDataSetChanged() 会有多糟糕?

也不错。

于 2014-02-24T01:58:06.313 回答
0

创建一个扩展的 DAO 类Observable,然后让您的适配器实现Observer。现在,每次添加或删除 SugarRecord 时,都通过 DAO 类进行操作,注册为观察者的人将通过以下方法得到通知:

@Override
public void update(Observable observable, Object o)

您可以在此处了解有关 Observable/Observer 模式的更多信息。这只是众多示例和教程之一。

于 2015-08-06T23:33:30.947 回答