您好,感谢您的帮助 我在这里问过如何从firebase中调查listview,谢天谢地Krishna Kishan解决了我的问题,但现在我喜欢做的是当我点击listview项目时,该项目将被移除,这是好的我做了这部分但我的问题是我想要从firebase数据中删除或删除列表视图中该特定项目的关联数据,这里是我的代码
listi.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
items.remove(position);
adapt.notifyDataSetChanged();
myRef.getRoot().child("message").removeValue();
}
});
但是这行代码会从firebase中删除所有内容,但我只想删除与listview项相关联的数据。
myRef.getRoot().child("message").removeValue();
我说明了更多。让我们点击每次点击我给firebase添加一个值,让我说1,然后我加2然后3,所以我的listview项目将是1,2和3 现在,当我点击listview上的2时,我想从listview和firebase中删除2并离开1和2,但我不想按名称调用它,因为如果我有大型listview,请说20项我想要一个用户点击任何项目,然后从列表和firebase中删除它们,以便下次重新启动应用程序时,列表视图将无法显示,因为它已从firebase中删除
答案 0 :(得分:0)
我假设你使用push()将这些消息添加到数据库中。由于push()生成基于时间的id,因此列表中元素的顺序是按时间顺序排列的,这意味着稍后添加的内容将在之前添加的内容之后添加。因此,当你推送()时,获取密钥并维护一个id列表。然后,在onClick中,使用position参数获取所单击项的id并将其删除到数据库中。这是一个例子:
List<String> ids; //update this list with ids as you push
..
//then in your onItemClick
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
rootReference.child("messages").child(ids.get(position)).removeValue();
//update any offline lists
}
请注意,这假设您还在ListView中以与数据库中相同的顺序显示消息。
答案 1 :(得分:0)
您必须修改一些在您发布的代码段之外的代码。
我猜你的items
是从数据库中读取的。当您阅读“消息”节点时,您必须保存密钥和值。
您可以通过多种方式实现这一目标。 e.g。
final ArrayList<String> keyList = new ArrayList<>();
final ArrayList<String> items = new ArrayList<>();
myRef.getRoot().child("messages")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot messages : dataSnapshot.getChildren()) {
keyList.add(messages.getKey());
items.add(messages.getValue(String.class));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
/*handle errors*/
}
});
现在你有了键和值。以这种方式修改OnClickListener:
listi.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
items.remove(position);
adapt.notifyDataSetChanged();
//new code below
myRef.getRoot().child("message").child(keyList.get(position)).removeValue();
keyList.remove(position);
}
});
当listi.setOnItemClickListener( ... )
和keyList
都被正确填充时,显然应该调用items
。请注意ValueEventListener
是异步的。