单击列表视图时,将其删除并在firebase中删除相关数据

时间:2017-06-22 13:13:50

标签: android listview firebase server

您好,感谢您的帮助 我在这里问过如何从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中删除

这是我的firebase数据库结构: firebase database structure

2 个答案:

答案 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是异步的。