2017-06-23 6 views
1

基本的にFirebaseからオブジェクトを削除した後、notifyDataSetChanged()はリアルタイムでそれを更新しません。アダプタ自体からオブジェクトを削除しようとしましたが、失敗します。Firebaseからの削除、notifyDataSetChanged();リフレッシュしないListView

この部分に戻ると、更新されたリストが表示されますが、子供が追加されたためだと思います。ここに私のコードです。

public class ArchiveFragment extends Fragment { 

    public static ArchiveFragment newInstance(Beer beer) { 
     ArchiveFragment archiveFragment = new ArchiveFragment(); 
     if (beer != null) { 
      Bundle args = new Bundle(); 
      args.putSerializable("beer", beer); 
      archiveFragment.setArguments(args); 
     } 
     return archiveFragment; 
    } 

    public ArchiveFragment(){} 

    private ArrayList<Beer> beerDB = new ArrayList<>(); 
    private ListView beerList; 
    private RecyclerView beerRec; 
    private DatabaseReference mDatabase; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.archive_fragment, container, false); 
     final Activity activity = getActivity(); 
     FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
     beerList = (ListView)view.findViewById(R.id.beerList); 
     final ArrayAdapter<Beer> arrayAdapter = new ArrayAdapter<Beer>(getActivity(), android.R.layout.simple_list_item_1,beerDB); 
     mDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(user.getUid()).child("BeerList"); 
     beerList.setAdapter(arrayAdapter); 

     beerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Object deletedBeer = beerList.getItemAtPosition(i); 
       Beer delBeer = (Beer) deletedBeer; 
       deleteBeer(delBeer.getKey()); 
      } 
     }); 

     mDatabase.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       Beer value = dataSnapshot.getValue(Beer.class); 
       value.setKey(dataSnapshot.getKey()); 
       beerDB.add(value); 

       arrayAdapter.notifyDataSetChanged(); 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) {} 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

       String key = dataSnapshot.getKey(); 
       beerDB.remove(key); 
       arrayAdapter.notifyDataSetChanged(); 
      } 

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

      @Override 
      public void onCancelled(DatabaseError databaseError) {} 
     }); 

     return view; 
    } 

    public void deleteBeer(String key){ 
     mDatabase.child(key).removeValue(); 
    } 
} 

答えて

0

あなたは間違っていremove機能を使用してArrayListから項目を削除しています。 remove関数は、削除する必要があるArrayListの項目のインデックスを取得します。しかし、ここでは、dataSnapshotからキーを取得すると、ArrayListのインデックスと一致せず、そのアイテムは実際にArrayListから削除されません。だからこのようなあなたのonChildRemoved関数を変更する必要があります。

@Override 
public void onChildRemoved(DataSnapshot dataSnapshot) { 

    String key = dataSnapshot.getKey(); 

    for (int i = 0; i < beerDB.size(); i++) { 
     // Find the item to remove and then remove it by index 
     if (beerDB.get(i).key.equals(key)) { 
      beerDB.remove(i); 
      break; 
     } 
    } 

    arrayAdapter.notifyDataSetChanged(); 
} 
+0

今すぐ動作しています!とてもありがとう、私はカップルの時間のためにこれと戦っていた。 :) –

+0

助けてくれたことを嬉しく思っています。 –

関連する問題