Android适配器如何决定重新渲染的内容?

时间:2014-02-24 01:45:11

标签: android android-listview android-arrayadapter sugarorm

说我有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同步,我也很高兴听到这一点。

2 个答案:

答案 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的信息。这只是众多示例和教程中的一个。