2017-01-16 4 views
0

私のコードで少し苦労しています。私は多くの方法を探して試しました。私の目的は、Firebaseがアプリケーションに提供した以前のエントリを削除することです。firebaseデータは埋め込みデバイスから取得しています。私はAndroidアプリケーションの値を置き換えたいと考えています。Firebaseが更新されたときにListViewから古いエントリを削除します

Firebaseが正常に動作しています。アプリケーションはfirebaseによって提供された新しい値を表示しますが、以前のエントリは削除しません。

私はまだたくさんあるが、移動する前に基本を修正したい。

基本的にOnChildChangedは新しいFirebaseエントリを表示しますが、Firebaseから新しい値が入力されると、Androidアプリケーションから以前のエントリが削除されます。私は無駄

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(); 
    } 

でたremoveValueとのsetValueに見ている

あなたがlist.removeを呼び出すときに、それはありませんが、あなたはそれが新しいエントリを取得していますvalueを割り当てるときのように見えます実際には新しいエントリのインスタンスを削除しようとしているので、古いエントリを削除します。

新しいエントリに古いエントリをマップする方法があるかどうかを確認してください。リストには、古いものと新しいものとの内容が異なるので、削除するものが分かっています。value

関連する問題