2017-10-06 1 views
0

Ich habe eine Firebase-Datenbank, die Daten in einer Listview anzeigen können. Alle Daten sind in Objekten enthalten, die Daten enthalten. Ich möchte in der Lage sein, Beispiel "Lars" in die Suchleiste zu schreiben, und dann muss die Listview nur die Objekte aktualisieren, die diese Zeichenfolge enthalten, und wenn ich alles aus der Suchleiste lösche, sollte es alles wieder anzeigen. Die erste for-Schleife funktioniert, und die zweite for-Schleife ist mein Versuch, die Daten zu suchen. My Firebase Struktur sieht wie folgt aus: enter image description hereSuchen von Daten aus Firebase mit Listview in Android

private DatabaseReference mDatabaseReference; 
    private ListView mUserList; 
    private SearchView searchModule; 

    private ArrayList<String> mUsernames = new ArrayList<>(); 
    private ArrayList<String> filteredUsernames = new ArrayList<>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_existing_customer); 

     mDatabaseReference = FirebaseDatabase.getInstance().getReference("Buyers"); 

     mUserList = (ListView) findViewById(R.id.UserListView); 


     searchModule = (SearchView) findViewById(R.id.SearchTab); 

     final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUsernames); 

     final ArrayAdapter<String> filteredArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, filteredUsernames); 

     mUserList.setAdapter(arrayAdapter); 

     mDatabaseReference.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) { 

        Map<String, String> map = (Map<String, String>) childSnapshot.getValue(); 
        Log.v("YourValue,","Map value is:" +map.toString()); 
        Log.d("TAG", "onChildAdded:" + dataSnapshot.getKey()); 
        Buyers buyerList = new Buyers(map); 
        mUsernames.add(buyerList.getData()); 
       } 
       CharSequence searchValue = (CharSequence) searchModule; 
       arrayAdapter.getFilter().filter(searchValue); 

       arrayAdapter.notifyDataSetChanged(); 
      } 


      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

    } 

Antwort

1

Drei Dinge:

  1. Sie fügen keine Daten zu filteredUsernames. Wie bei mUsernames sollten Sie die Daten zu filteredUsernames hinzufügen.
  2. getFilter ist eine Methode der ArrayAdapter, können Sie es auf filteredArrayAdapter
  3. Sie einen Listener auf der Abfrage alle Änderungen hören können verwendet werden soll und einen Filter

    for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) { 
        Map<String, String> map = (Map<String, String>) childSnapshot.getValue(); 
        Buyers buyerList = new Buyers(map); 
        filteredUsernames.add(buyerList.getData()); 
    } 
    
    searchModule.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
        @Override 
        public boolean onQueryTextSubmit(String query) { 
         return false; 
        } 
    
        @Override 
        public boolean onQueryTextChange(String newText) { 
         filteredArrayAdapter.getFilter().filter(newText); 
         filteredArrayAdapter.notifyDataSetChanged(); 
         return true; 
        } 
    }); 
    

Dies ist mehr gelten oder weniger wie es aussehen soll. Da der Filter jedoch auf den Adapter angewendet wird, können Sie feststellen, dass "filteredUserNames" und "mUsernames" identisch sind, sodass Sie eigentlich keine zwei Listen benötigen. Wenn Sie die Filter benötigen, können Sie die Filterung auch manuell mit einer if-Anweisung und einer contains-Prüfung durchführen.

+0

Ich habe versucht, Ihren Code, der das ListView immer noch wie vorgesehen gibt, aber es macht mich nicht in der Lage, nach etwas zu suchen. Irgendwelche Ideen? – Michael

+0

Verpasste die Suche Teil, bearbeitet, um es hinzuzufügen. Grundsätzlich sollten Sie in der Lage sein, einen Listener zu verwenden, um Änderungen zu hören und den Filter zu aktualisieren. Ich habe den Code nicht getestet, trotzdem sollte es funktionieren. Außerdem ist notifyDataSetChange möglicherweise nicht erforderlich, da Sie tatsächlich einen Filter auf den Adapter anwenden und die Datenmenge nicht ändern. – merterpam

Verwandte Themen