2017-01-16 74 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的內容在新舊之間不同。