Android 如何正确刷新ListView?

Android 如何正确刷新ListView?,android,android-listview,google-cloud-firestore,Android,Android Listview,Google Cloud Firestore,我有一个listview,它接收对象的arraylist并显示在屏幕上,该对象arraylist取自firebase中的数据库,当我从数据库中添加或删除文档对象时,listview会正常更新。但是,当我修改单个对象字段文档时,listview在视图中完全重新创建该对象,并在每次修改状态字段时进行复制 这是填充列表视图的我的代码: usuarios.orderBylikes,Query.Direction.DESCENDING; 试一试{ usuarios.addSnapshotListener新

我有一个listview,它接收对象的arraylist并显示在屏幕上,该对象arraylist取自firebase中的数据库,当我从数据库中添加或删除文档对象时,listview会正常更新。但是,当我修改单个对象字段文档时,listview在视图中完全重新创建该对象,并在每次修改状态字段时进行复制

这是填充列表视图的我的代码:

usuarios.orderBylikes,Query.Direction.DESCENDING; 试一试{ usuarios.addSnapshotListener新建事件侦听器{ @凌驾 公共空间onEvent@NullableQuerySnapshot queryDocumentSnapshots,@Nullable FirebaseFirestoreException e{ 如果e!=null{ Log.wNão consegue,listen:error,e; 回来 } 对于DocumentChange dc:queryDocumentSnapshots.getDocumentChanges{ 开关dc.getType{ 案件补充: Log.dTAG,新消息:+dc.getDocument.toObjectDoenca.class; doenca=dc.getDocument.ToObject doenca.class; doencarraylist.adddoenca; 打破 已删除的案例: Log.dTAG,删除消息:+dc.getDocument.toObjectDoenca.class; doenca=dc.getDocument.ToObject doenca.class; doencarraylist.adddoenca; 打破 案例修改: //DoenCarrayList.RemovedOenCarrayList.lastIndexOfdoenca; Log.dTAG,修改:+dc.getDocument.toObjectDoenca.class; doenca=dc.getDocument.ToObject doenca.class; doencarraylist.adddoenca; 打破 } } ListView ListView=ListView root.findViewByIdR.id.RecycleServiceWCADPAT; ArrayAdapter adapter=新的DoencaAdaptergetActivity,doencaArrayList; listView.setAdapteradapter; adapter.notifyDataSetChanged; } }; }捕获NullPointerException e{ Toast.makeTextgetActivity、Erro interno、Toast.LENGTH\u SHORT.show; }
请注意,有3种状态,一种是添加所有权限,一种是删除所有权限,另一种是修改此状态使listview复制对象。

当在firebase数据库中更新特定数据时,将调用EventListener的一个事件,您的列表将获得更新的值,但仍有旧值。因此,首先,清除列表,然后在OneEvent方法中将数据添加到列表中

像这样的

public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
   if (e != null) {
       Log.w("Não consegue", "listen:error", e);
       return;
   }

   //clear your list first
   doencaArrayList.clear();
   ...
   ...
}

这个方法会从ArrayList中删除所有类型的数据,即使是那些没有被修改的数据。是的,它会。但是,由于您要对每个文档进行迭代,只需直接将其添加到列表中,而不必使用dc.getType。但我不再没有dc.getType了?您是要我取消添加开关吗?是的,当然会。我认为这是另一个问题。为了更好地实现,您可以使用。但是按照我的建议实现肯定会让您消除列表中的重复值。