2017-01-16 81 views
0

Im我的代码挣扎了一下。我已经搜索并尝试了很多方法。我的目标是删除Firebase提供给我的应用的以前的条目,Firebase数据来自嵌入式设备。我想替换我的Android应用中的值。更新Firebase时从ListView中删除旧条目

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) { 

     } 
    }); 
} 

}

+1

我发现了一个解决方案,很简单,我添加了adapter.clear到OnChildChanged –

回答

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的内容在新旧之间不同。