2016-08-29 81 views
2

嗨,我正在開發一個應用程序,我已經在fregement.i中實現回收視圖和searchview。根據文本更改第一次獲取過濾器產品。 但是當我逐個刪除文本時,所有列表都將爲空。最後可以顯示。searchview與回收視圖無法正常工作

這裏是我的fragement

+0

使用[這](https://gist.githubusercontent.com/pskink/cd3bbdd742b5b1905a790c76831b5d85/raw/89a41acded0889028be48e1f669562046cf66126/MatchableRVArrayAdapte%2520(純%2520RecyclerView%,你應該使用一些其他的陣列2520style,%2520no%2520implicit%2520TextView%2520mapping))通用適配器 – pskink

回答

1

我的代碼,我認爲這個問題是在filter方法if (text.isEmpty()) {塊。
這裏您清除plistarray列表,並添加plistarray.addAll(plistarray);

而不是這一點,空列表添加原始數據列表plistarray.addAll();這將解決您的空列表問題。
記住這一點,當您執行搜索時,首先在適配器的構造函數中創建一個原始列表的虛擬/副本,並使用此虛擬來恢復數據。

希望這會解決你的問題。

1

正如我看到的主要問題是您正在操縱List您的適配器從中填充,但您沒有原始數據集的「複製」。

像這樣的東西應該工作:

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

您在名爲plistarray

在這裏您清除plistarray,並再次使用相同的查找記錄filter()方法單一array連續運行。所以你適配器,而不是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檢查我的答案,也參考代碼中的註釋 – Nikhil

+0

@unknown apk你可能接受我的答案,如果這有助於你 – Nikhil