Java 在Android中,从Firebase实时数据库检索数据到ListView的最佳方式是什么。。。关闭
例如,我有一个简单的ListView应用程序。每个项目有3个文本视图 这是我的JSON文件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
{
"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我做了,听到这个消息很好!