Android适配器如何决定重新渲染什么?

Android适配器如何决定重新渲染什么?,android,android-listview,android-arrayadapter,sugarorm,Android,Android Listview,Android Arrayadapter,Sugarorm,假设我有一个列表。现在,我可以将此列表包装在ArrayAdapter中 List<User> users = Users.getAll(); ArrayAdapter<User> = new ArrayAdapter<User>(this, android.R.layout.simple_list_item_1, users); List users=users.getAll(); ArrayAdapter=新的ArrayAdapter(这是android.

假设我有一个
列表
。现在,我可以将此列表包装在ArrayAdapter中

List<User> users = Users.getAll();
ArrayAdapter<User> = new ArrayAdapter<User>(this, android.R.layout.simple_list_item_1, users);
List users=users.getAll();
ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,用户);
然后将适配器绑定到listview以显示用户列表

Users.getAll()
使用Sugar ORM查询数据库并返回用户列表。可以从显示用户列表的活动中将项目添加到用户列表中。我想知道如何更新listview

选项1

一种方法是手动更新
用户
,将其作为I添加到数据库中,然后调用
适配器.notifyDataSetChanged()
。这是可行的,但感觉不对,因为我维护了一个代表数据库中内容的“假”列表

选项2

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

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

其他信息


因为我使用的是SugarORM,所以我认为我无法访问游标来做更有效的事情。但是,如果有更好的方法使列表与SugarORM保持同步,我也很高兴听到这个消息。

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

这里最好的选择是创建您自己的适配器,创建一个扩展BaseAdapter的类,并在其中创建您自己的逻辑,重新查询数据库并通知listview(或gridview)的更改

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

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


也不错。

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

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

您可以了解更多有关可观察/观察者模式的信息。这只是众多示例和教程中的一个

如果这是您要查找的答案,请在左侧用复选标记将其标记为已回答