2016-08-29 3 views
2

Hallo ich bin eine App zu entwickeln, wo ich Recycler-Ansicht und Searchview in fregement.i implementiert habe, um das Filterprodukt erstmals nach Textänderung zu erhalten. Aber wenn ich Text nach dem anderen lösche alle Liste wird leer sein. Nothinging kann am Ende angezeigt werden.Searchview mit Recycler-Ansicht funktioniert nicht richtig

Hier ist mein Code von meinem Bruchstücke

+0

Verwendung [diese] (https://gist.githubusercontent.com/pskink/cd3bbdd742b5b1905a790c76831b5d85/raw/89a41acded0889028be48e1f669562046cf66126/MatchableRVArrayAdapte%2520 (reine% 2520RecyclerView% 2520style,% 2520no% 2520implicit% 2520TextView% 2520mapping)) generische Adapter – pskink

Antwort

1

Ich denke, das Problem bei dem Verfahren if (text.isEmpty()) { Block filter ist.
Hier löschen Sie die plistarray Liste und fügen Sie diese leere Liste in plistarray.addAll(plistarray);

dieses Stattdessen fügen Sie Ihre Original Datalist für die plistarray.addAll(); Dies wird Ihr Problem mit der leeren Liste lösen.
Denken Sie daran, wenn Sie die Suche durchführen, erstellen Sie immer zuerst einen Dummy/eine Kopie der ursprünglichen Liste im Konstruktor des Adapters und verwenden Sie diesen Dummy, um die Daten wiederherzustellen.

Hoffe, das wird Ihr Problem lösen.

1

Wie ich sehe das Hauptproblem ist, Sie manipulieren die List Ihren Adapter ist gefüllt, aber Sie haben keine "Kopie" der ursprünglichen Datenmenge.

So etwas sollte funktionieren:

ArrayList<ProductList> plistarray;  // these are instance variables 
ArrayList<ProductList> plistarrayCopy; // in your adapter 

// ... 

public void filter(String text) { 
    if (plistarrayCopy == null) { 
     plistarrayCopy = new ArrayList<>(plistarray); 
    } 

    if (text.isEmpty()) { 
     plistarray.clear(); 
     plistarray.addAll(plistarrayCopy); 
     plistarrayCopy = null; 
    } else { 
     text = text.toLowerCase(); 
     ArrayList<Device> filteredList = new ArrayList<>(); 

     for (ProductList pList : plistarrayCopy) { 
      if (pList.getPtitle().toLowerCase().contains(text)) { 
       filteredList.add(pList); 
      } 
     } 
     plistarray.clear(); 
     plistarray.addAll(filteredList); 
    } 
    notifyDataSetChanged(); 
} 
1

Sie sind auf einzelne arrayplistarray namens

hier in filter() Verfahren kontinuierlich arbeit Sie plistarray und wieder gelöscht wurden verwendet, um die gleichen Datensätze zu finden. so sollten Sie einige andere Array verwenden für Sie eher Adapter als plistarray

public void filter(String text) { 
     if (text.isEmpty()) { 
      plistarray.clear(); 
      plistarray.addAll(plistarray); 
     } else { 
      ArrayList<ProductList> result = new ArrayList<>(); 
      text = text.toLowerCase(); 
      //after clearing the array again you are using same array to find the items from 
      for (ProductList item : plistarray) { 
       if (item.getPtitle().toLowerCase().contains(text)) { 
        result.add(item); 
       } 
      } 
      //you have cleared all the contains here 
      plistarray.clear(); 
      // and added only result related items here 
      plistarray.addAll(result); 
     } 
     notifyDataSetChanged(); 
    } 
+1

@unknown apk überprüfen Sie meine Antwort und verweisen Sie auch Kommentare in Code – Nikhil

+0

@unknown apk Sie können meine Antwort akzeptieren, wenn das Ihnen geholfen hat – Nikhil