2016-06-13 7 views
0

Ich habe ein searchView ich die ResName, resLoc, ResTyp filtern wollen, aber leider hat es nicht funktioniertAndroid Benutzerdefinierte Listenansicht mit Bildern und Unterpunkte Suche nicht funktioniert

public class caloocan extends AppCompatActivity { 
    String FIREBASE_URL = "https://restaulist1.firebaseio.com"; 
    Firebase firebaseRef; 
    private List<caloocanDB> Restau = new ArrayList<>(); 
    SearchView searchView; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.caloocan); 
     Firebase.setAndroidContext(this); 
     firebaseRef = new Firebase(FIREBASE_URL); 
     searchView = (SearchView) findViewById(R.id.searchView); 
     // populateListView(); 
     // populateRestauList(); 

     final MyListAdapter adapter = new MyListAdapter(); 
     ListView list = (ListView) findViewById(R.id.listViewRest); 
     //populate restau List 
     firebaseRef.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String[] resName = new String[(int) dataSnapshot.getChildrenCount()]; 
       String[] resLoc = new String[(int) dataSnapshot.getChildrenCount()]; 
       String[] resType = new String[(int) dataSnapshot.getChildrenCount()]; 
       int i = 0; 
       for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) { 
        resName[i] = dataSnapshot1.child("resname").getValue().toString(); 
        resLoc[i] = dataSnapshot1.child("resloc").getValue().toString(); 
        resType[i] = dataSnapshot1.child("foodtype").getValue().toString(); 
        Restau.add(new caloocanDB(resName[i], resLoc[i], R.drawable.six, resType[i])); 
        i++; 
       } 
      } 
      @Override 
      public void onCancelled(FirebaseError firebaseError) { 
      } 
     }); 
     list.setAdapter(adapter); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String text) { 
       return false; 
      } 
      @Override 
      public boolean onQueryTextChange(String text) { 
       adapter.getFilter().filter(text); 
       return false; 
      } 
     }); 

    } 
    public class MyListAdapter extends ArrayAdapter<caloocanDB> { 
     public ArrayList<caloocanDB> tempRestList = new ArrayList<>(); 
     public MyListAdapter(){ 
      super(caloocan.this, R.layout.caloocan_list_view, Restau); 
      tempRestList = new ArrayList<caloocanDB>(Restau); 
     } 

     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      View caloocanView = convertView; 
      if (caloocanView == null) 
       caloocanView = getLayoutInflater().inflate(R.layout.caloocan_list_view, parent, false); 

      caloocanDB restaurant = Restau.get(position); 
      //FILL VIEW 
      ImageView imageView = (ImageView)caloocanView.findViewById(R.id.imageView); 
      imageView.setImageResource(restaurant.getIconID()); 
      // RESTAU NAME 
      TextView restauName = (TextView)caloocanView.findViewById(R.id.resnameTxt); 
      restauName.setText(restaurant.getResname()); 
      //RESTAU LOCA 
      TextView location = (TextView)caloocanView.findViewById(R.id.reslocTxt); 
      location.setText(restaurant.getResloc()); 
      //FOOD TYPE 
      TextView restype = (TextView)caloocanView.findViewById(R.id.restypeTxt); 
      restype.setText(restaurant.getType()); 
      return caloocanView; 
     } 
     public void filter(String text) { 
      Restau.clear(); 

      for (caloocanDB element : tempRestList) { 
       if (element.getResname().toLowerCase().startsWith(text) || element.getType().toLowerCase().startsWith(text) || element.getResloc().toLowerCase().startsWith(text)){ 
        Restau.add(element); 
       } 
      } 
      super.notifyDataSetChanged(); 
     } 
    } 
} 

I Haltepunkt hinzugefügt in adapter.filter(); und dies ist das Ergebnis, wenn ich etwas in der Suche enter image description here

ich die ResName, resLoc, ResTyp aber nichts Filter, filtern möchten getippt Blick auf das Bild unter Adapter> mObjects die 0,1,2,3,4, 5 sind meine Listview-Elemente mit Text . Ich mag es auf Filter

+0

bekommen Sie Ihren Adapter Code schreiben ?? – himanshu1496

+0

Überprüfen Sie die aktualisierte @ Himanshu1496 –

+0

und können Sie sagen, durch welches Element Ihres caloocanDB-Objekts möchten Sie die Liste filtern? – himanshu1496

Antwort

1

Durch welche Eigenschaft sind Filterung Ihnen, Sie eine Methode in Adapter nach dem schreiben können, zum Beispiel Ihrer Filterung mit Restaurantnamen, dann unter

private class MyListAdapter extends ArrayAdapter<caloocanDB> { 
     public static ArrayList<coloocanDB> tempRestList = new ArrayList<>(); 
     public static ArrayList<coloocanDB> restList = new ArrayList<>(); 
     public MyListAdapter(ArrayList<caloocanDB> objects){ 
      super(caloocan.this, R.layout.caloocan_list_view, objects);  tempRestList = new ArrayList<>(); 
      restList = objects; 
      tempRestList.addAll(objects); 
     } 

     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      View caloocanView = convertView; 
      if (caloocanView == null) 
       caloocanView = getLayoutInflater().inflate(R.layout.caloocan_list_view, parent, false); 

      caloocanDB restaurant = restList.get(position); 
      //FILL VIEW 
      ImageView imageView = (ImageView)caloocanView.findViewById(R.id.imageView); 
      imageView.setImageResource(restaurant.getIconID()); 
      // RESTAU NAME 
      TextView restauName = (TextView)caloocanView.findViewById(R.id.resnameTxt); 
      restauName.setText(restaurant.getResname()); 
      //RESTAU LOCA 
      TextView location = (TextView)caloocanView.findViewById(R.id.reslocTxt); 
      location.setText(restaurant.getResloc()); 
      //FOOD TYPE 
      TextView restype = (TextView)caloocanView.findViewById(R.id.restypeTxt); 
      restype.setText(restaurant.getType()); 
      return caloocanView; 
     } 


    public void filter(String filter) { 
     restList.clear(); 
     if(filter != null && filter.trim().length() > 0){ 
     for (caloocanDB element : tempRestList){ 
      if (element.getResname().contains(filter) || element.getType().contains(filter) || element.getResLoc().contains(filter)) 
      restList.add(element); 
      } 
     }else{ 
      restList.addAll(tempRestList); 
     } 
     super.notifyDataSetChanged(); 
    } 
} 

Code schreiben und in Ihrer Suche Listener

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String text) { 
      return false; 
     } 
     @Override 
     public boolean onQueryTextChange(String text) { 
      adapter.filter(text); 
      return false; 
     } 
    }); 

Und in Ihrer Aktivität

firebaseRef.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String[] resName = new String[(int) dataSnapshot.getChildrenCount()]; 
       String[] resLoc = new String[(int) dataSnapshot.getChildrenCount()]; 
       String[] resType = new String[(int) dataSnapshot.getChildrenCount()]; 
       int i = 0; 
       for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) { 
        resName[i] = dataSnapshot1.child("resname").getValue().toString(); 
        resLoc[i] = dataSnapshot1.child("resloc").getValue().toString(); 
        resType[i] = dataSnapshot1.child("foodtype").getValue().toString(); 
        Restau.add(new caloocanDB(resName[i], resLoc[i], R.drawable.six, resType[i])); 
        i++; 
       } 
     final MyListAdapter adapter = new MyListAdapter(Restau); 
     ListView list = (ListView) findViewById(R.id.listViewRest); 
      } 
      @Override 
      public void onCancelled(FirebaseError firebaseError) { 
      } 
     }); 
+0

Ich möchte ResName, ResLoc, ResType suchen. –

+0

Ich bekomme einen Fehler, wenn ich 'adapter.filter (text);' es liest keine Variable oder Methode. weil ich den 'öffentlichen void filter' nach 'public view getView' eingefügt habe –

+0

kannst du logcat posten? –

0

Hi Allen können Sie etwas wie unten versuchen, und die Suchlogik innerhalb der Filterklasse kann basierend auf Ihren Suchanforderungen modifiziert werden. In der folgenden Codesuche wird die Zeichenfolge als Ergebnis betrachtet, wenn sie mit dieser Zeichenfolge beginnt.

+0

Hallo, danke für die Idee, aber Constrain kann das Symbol nicht lösen. –

+0

Ja, ich habe vergessen, diese Variable zu ändern, überprüfen Sie bitte meine aktualisierte Antwort !! – himanshu1496

0

Sie initialisieren den Adapter leer und daher wird nichts gefiltert.

ändern Initialisierung durchgeführt werden, nachdem Sie Daten aus dem Firebase

final ListView list = (ListView) findViewById(R.id.listViewRest); 
    //populate restau List 

//inside the dataobserver 
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) { 
     resName[i] = dataSnapshot1.child("resname").getValue().toString(); 
     resLoc[i] = dataSnapshot1.child("resloc").getValue().toString(); 
     resType[i] = dataSnapshot1.child("foodtype").getValue().toString(); 
     Restau.add(new caloocanDB(resName[i], resLoc[i], R.drawable.six, resType[i])); 
     i++; 
} 
MyListAdapter adapter = new MyListAdapter(Restau); 
list.setAdapter(adapter);