2017-10-07 2 views
0

J'utilise une base de données firebase pour contenir des données que je veux être en mesure de rechercher. Je peux insérer mes données de Firebase dans un objet. Je veux être capable de rechercher tous les éléments dans tous les objets, mais je veux seulement deux valeurs affichées dans le ListView. J'ai le code suivant qui récupère des données de Firebase, l'insère dans un objet et renvoie deux valeurs, que je suis capable de rechercher. Mon problème est comme dit que je peux facilement faire la recherche à travers tous les éléments en retournant tout simplement dans le "getData()", mais je veux seulement le nom et numéro de téléphone affiché dans le ListView. Quelqu'un qui a une idée sur la façon de faire cela?Rechercher dans toutes les valeurs dans un objet personnalisé, mais seulement afficher quelques-unes des valeurs dans un ListView Android

classe de l'objet:

private String car_Value; 
private String interest; 
private String driverLicenseNr; 
private String name; 
private String personNr; 
private String phone_Number; 

public Buyers(Map<String,String> map){ 
    car_Value = map.get("Bil"); 
    interest = map.get("Interesse"); 
    driverLicenseNr = map.get("Kørekortnr"); 
    name = map.get("Navn"); 
    personNr = map.get("Personnr"); 
    phone_Number = map.get("Telefonnr"); 
} 
String getData() 
{ 
    return (name + " " + phone_Number); 
} 

classe Recherche:

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

    searchModule = (SearchView) findViewById(R.id.SearchTab); 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference("Buyers"); 
    mUserList = (ListView) findViewById(R.id.UserListView); 

    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(); 
       Buyers buyerList = new Buyers(map); 
       mUsernames.add(buyerList.getData()); 
       //filteredUsernames.add(buyerList.getData()); 
       arrayAdapter.notifyDataSetChanged(); 
      } 
      searchModule.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
       @Override 
       public boolean onQueryTextSubmit(String query) { 
        arrayAdapter.getFilter().filter(query); 
        return false; 
       } 
       @Override 
       public boolean onQueryTextChange(String query) { 
        arrayAdapter.getFilter().filter(query); 
        arrayAdapter.notifyDataSetChanged(); 
        return true; 
       } 
      }); 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
} 

Répondre

0

vous devez personnaliser ArrayAdapter d'utiliser un objet spécial de filtre.

Il serait plus facile de stocker toutes les données en dehors de ListView et d'ajouter uniquement les données filtrées à ListView. (alors il n'est pas nécessaire de personnaliser ArrayAdapter)

+0

Je suis d'accord. Mon problème est que je suis nouveau, et je ne peux pas voir un moyen d'ajouter toutes les données à un arraylist et ensuite filtrer ces données et les transférer à un autre arraylist, qui peut ensuite être montré. – Michael

+1

Eh bien, vous pouvez avoir un 'ArrayList all_buyers' quelque part, indépendamment de la ListView, qui contient tous les acheteurs. Vous pouvez écrire une fonction ArrayList filter_buyers (ArrayList all_buyers, requête String) ', qui parcourt la liste, vérifie tous les champs de tous les objets, ajoute tous les objets correspondants à une nouvelle liste (celle qu'elle renvoie), mais ajoute seulement le résultat de 'buyer.getData()' (une simple chaîne). Il retourne ce tableau de chaînes simples. (Je l'ai presque écrit maintenant :)). onQueryTextSubmit() appelle cette fonction et met à jour le ListView avec le résultat ... – gregn3