更新 Firebase 时从 ListView 中删除旧条目

Posted

技术标签:

【中文标题】更新 Firebase 时从 ListView 中删除旧条目【英文标题】:Remove old entry from ListView when Firebase is updated 【发布时间】:2017-01-16 14:32:39 【问题描述】:

我的代码有点吃力。我已经搜索并尝试了很多方法。我的目标是删除 Firebase 提供给我的应用的上一个条目,firebase 数据来自嵌入式设备。我想替换我的 android 应用中的值。

Firebase 工作正常,应用会显示 firebase 提供的新值,但不会删除之前的条目。

我还有很多事情要做,但我想在继续之前解决基础问题。

所以基本上 OnChildChanged 将显示新的 firebase 条目,我只想在 Firebase 输入新值时从 Android 应用程序中删除上一个条目。

我已经研究了 removeValue 和 setValue 无济于事

public class MainActivity extends AppCompatActivity 
DatabaseReference fDatabase;
ListView listview;
ArrayList<String> list = new ArrayList<>();
ArrayAdapter <String> adapter;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listview = (ListView) findViewById(R.id.listview);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, list);
    listview.setAdapter(adapter);


    fDatabase = FirebaseDatabase.getInstance().getReference();
    fDatabase.addChildEventListener(new ChildEventListener() 
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) 
            String value = dataSnapshot.getValue(String.class);
            list.add(value);
            adapter.notifyDataSetChanged();

        

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) 
            String value = dataSnapshot.getValue(String.class);
            list.remove(value);
            adapter.notifyDataSetChanged();
            list.add(value);
            adapter.notifyDataSetChanged();

        

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) 

        

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) 

        

        @Override
        public void onCancelled(DatabaseError databaseError) 

        
    );

【问题讨论】:

我找到了一个解决方案,很简单,我在 OnChildChanged 中添加了 adapter.clear 【参考方案1】:
    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) 
        String value = dataSnapshot.getValue(String.class);
        list.remove(value);
        adapter.notifyDataSetChanged();
        list.add(value);
        adapter.notifyDataSetChanged();
    

看起来当您分配 value 时它正在获取新条目,因此当您调用 list.remove 时它并没有删除旧条目,因为它实际上是在尝试删除新条目的任何实例。

看看是否有任何方法可以将旧条目映射到新条目,以便列表知道要删除什么,因为 value 的内容在新旧之间是不同的。

【讨论】:

以上是关于更新 Firebase 时从 ListView 中删除旧条目的主要内容,如果未能解决你的问题,请参考以下文章

使用Firebase时,ListView仅在onCreate()方法中更新

使用 StreamBuilder 和从 Firebase Firestore 数据库查询时,ListView 不会更新/获取数据

如何使用 Firebase 查询的结果最终在 Android Studio 中填充 ListView

如何在发现时从蓝牙过滤 ListView 中显示的设备

如何在单击android中的listview项目时从数据库中获取id

Firebase身份验证未经许可更新用户配置文件