Java 在Android中,从Firebase实时数据库检索数据到ListView的最佳方式是什么。。。关闭

Java 在Android中,从Firebase实时数据库检索数据到ListView的最佳方式是什么。。。关闭,java,android,firebase,android-studio,firebase-realtime-database,Java,Android,Firebase,Android Studio,Firebase Realtime Database,例如,我有一个简单的ListView应用程序。每个项目有3个文本视图 这是我的JSON文件 { "list-view": [ { "date": "23 October 2020", "description": "Lorem ipsum dolor sit amet.", "name": "Carl Johnson&q

例如,我有一个简单的ListView应用程序。每个项目有3个文本视图

这是我的JSON文件

{
  "list-view": [
    {
      "date": "23 October 2020",
      "description": "Lorem ipsum dolor sit amet.",
      "name": "Carl Johnson"
    },
    {
      "date": "27 October 2020",
      "description": "Lorem ipsum dolor sit amet.",
      "name": "Sean Johnson"
    }
  ]
}
这是我的Java代码

public class ListViewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);

        ListView listView = findViewById(R.id.list_example);
        final ArrayList<ListViewHelperClass> arrayList = new ArrayList<>();
        final ListViewAdapter listViewAdapter = new ListViewAdapter(getApplicationContext(), arrayList);

        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
        Query query = FirebaseDatabase.getInstance().getReference().child("list-view");
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (int i = 0; i < 2; i++) {

                    ListViewHelperClass listViewHelperClass = new ListViewHelperClass();

                    String name = dataSnapshot.child(String.valueOf(i)).child("name").getValue(String.class);
                    String date = dataSnapshot.child(String.valueOf(i)).child("date").getValue(String.class);
                    String description = dataSnapshot.child(String.valueOf(i)).child("description").getValue(String.class);

                    listViewHelperClass.setName(name);
                    listViewHelperClass.setDate(date);
                    listViewHelperClass.setDescription(description);
                    arrayList.add(listViewHelperClass);

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        listView.setAdapter(listViewAdapter);

    }
}
公共类ListViewActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u list\u视图);
ListView ListView=findViewById(R.id.list_示例);
最终ArrayList ArrayList=新ArrayList();
最终ListViewAdapter ListViewAdapter=新的ListViewAdapter(getApplicationContext(),arrayList);
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
Query Query=FirebaseDatabase.getInstance().getReference().child(“列表视图”);
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(int i=0;i<2;i++){
ListViewHelperClass ListViewHelperClass=新建ListViewHelperClass();
String name=dataSnapshot.child(String.valueOf(i)).child(“name”).getValue(String.class);
String date=dataSnapshot.child(String.valueOf(i)).child(“date”).getValue(String.class);
String description=dataSnapshot.child(String.valueOf(i)).child(“description”).getValue(String.class);
listViewHelperClass.setName(名称);
listViewHelperClass.setDate(日期);
listViewHelperClass.setDescription(描述);
添加(listViewHelperClass);
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
setAdapter(listViewAdapter);
}
}

我已经搜索了很多帖子并使用了这段代码。但是,这是最好的办法吗?还是有人有更有效的方法?特别是对于支持脱机模式的应用程序。

您缺少对
onDataChange方法中的
listViewAdapter.notifyDataSetChanged()
的调用。如果没有这样的调用,Android不知道它需要重新绘制列表视图

每次修改列表视图显示的数据集时,都需要将此情况通知适配器。在您的情况下,这应该简单到:

arrayList.add(listViewHelperClass);
listViewAdapter.notifyDataSetChanged();

@AlexMamo:我看这里没有滥用异步API调用,将对
setAdapter
的调用保持在
onDataChange
之外实际上更惯用,因为它消耗更少的资源。你能解释一下为什么你认为这是你链接的问题的重复吗?你在你的
onDataChange
方法中缺少对
listViewAdapter.notifyDataSetChanged()
的调用。如果没有这样的调用,Android不知道它需要重新绘制列表视图。你做了那个更改吗,它有帮助吗?@FrankVanPuffelen我做了,听到这个消息很好!