为什么我的 ListView 在向 Firebase 添加新数据后不刷新?
Why doesn't my ListView refresh after adding new data to Firebase?
我在将字符串推送到 firebase 后重新加载 ListView
时遇到问题。 ListView
在我重新启动应用程序时更新。我在 ListAdapter
中使用了 notifyDataSetChanged()
函数。这是我正在做的事情:
myFirebaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d("App",dataSnapshot.getValue().toString());
names = dataSnapshot.getValue().toString();
String[] planets = new String[] { names, "Venus", "Earth", "Mars",
"Jupiter", "Saturn", "Uranus", "Neptune"};
ArrayList<String> planetList = new ArrayList<String>();
namesList.addAll( Arrays.asList(planets) );
// Create ArrayAdapter using the planet list.
listAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, android.R.id.text1, namesList);
mainListView.setAdapter(listAdapter);
listAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
每次您创建新的列表适配器时。就用旧的吧。这里存在冲突,因为您正在创建一个新的适配器并将其设置为与调用 notifyDatachanged 的时间相同。这是不合逻辑的。不绑定新适配器。
这里是 Firebase 工程师,
我建议查看 simple chat example I made recently (what you're trying to do is detailed here) or our more fully fleshed out Android Chat example,它们都演示了如何使用模型对象绑定到 ArrayAdapter 和 ListView。
TL;DR 是您想要做的更像这样的事情:
// Create instance variables to be used from inside your activity
private ArrayList<Map<String, Object>> mMessages;
private Firebase mRef;
...
// Some time later, instantiate your instance variables
this.mMessages = new ArrayList<Message>();
// Set up ListAdapter
ListAdapter messageAdapter = new ArrayAdapter(this , R.layout.message_layout , mMessages);
this.setListAdapter(messageAdapter);
// Set up Firebase
Firebase.setAndroidContext(this);
this.mRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
// Add listener to your Firebase database reference
this.mRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
// Create objects and add to ArrayList, which should fire ArrayAdapter methods and update the ListView
Map<String, Object> data = (Map<String, Object>)dataSnapshot.getValue();
MainActivity.this.mMessages.add(data);
}
...
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
我在将字符串推送到 firebase 后重新加载 ListView
时遇到问题。 ListView
在我重新启动应用程序时更新。我在 ListAdapter
中使用了 notifyDataSetChanged()
函数。这是我正在做的事情:
myFirebaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d("App",dataSnapshot.getValue().toString());
names = dataSnapshot.getValue().toString();
String[] planets = new String[] { names, "Venus", "Earth", "Mars",
"Jupiter", "Saturn", "Uranus", "Neptune"};
ArrayList<String> planetList = new ArrayList<String>();
namesList.addAll( Arrays.asList(planets) );
// Create ArrayAdapter using the planet list.
listAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, android.R.id.text1, namesList);
mainListView.setAdapter(listAdapter);
listAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
每次您创建新的列表适配器时。就用旧的吧。这里存在冲突,因为您正在创建一个新的适配器并将其设置为与调用 notifyDatachanged 的时间相同。这是不合逻辑的。不绑定新适配器。
这里是 Firebase 工程师,
我建议查看 simple chat example I made recently (what you're trying to do is detailed here) or our more fully fleshed out Android Chat example,它们都演示了如何使用模型对象绑定到 ArrayAdapter 和 ListView。
TL;DR 是您想要做的更像这样的事情:
// Create instance variables to be used from inside your activity
private ArrayList<Map<String, Object>> mMessages;
private Firebase mRef;
...
// Some time later, instantiate your instance variables
this.mMessages = new ArrayList<Message>();
// Set up ListAdapter
ListAdapter messageAdapter = new ArrayAdapter(this , R.layout.message_layout , mMessages);
this.setListAdapter(messageAdapter);
// Set up Firebase
Firebase.setAndroidContext(this);
this.mRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
// Add listener to your Firebase database reference
this.mRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
// Create objects and add to ArrayList, which should fire ArrayAdapter methods and update the ListView
Map<String, Object> data = (Map<String, Object>)dataSnapshot.getValue();
MainActivity.this.mMessages.add(data);
}
...
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});