2016-08-29 1 views
2

こんにちは私はfregement.iのリサイクラービューとsearchviewを実装したアプリケーションを開発しています。 しかし、テキストを1つずつ削除すると、すべてのリストが空になります。最後に表示することができます。searchview with recyclerビューが正常に動作しない

は、ここで私は問題はfilter方法のif (text.isEmpty()) {ブロックであると思い、私のfragement

+0

なければならない[この](https://gist.githubusercontent.com/pskink/cd3bbdd742b5b1905a790c76831b5d85/raw/89a41acded0889028be48e1f669562046cf66126/MatchableRVArrayAdapte%2520(純粋%2520RecyclerView% )generic adapter – pskink

答えて

1

から私のコードです。
ここでは、plistarrayリストをクリアし、plistarray.addAll(のためのあなたの元データリストを追加するこの代わりにplistarray.addAll(plistarray);

にその空のリストを追加します)。これで空リストの問題が解決されます。
これを覚えておいてください。検索を実行する際は、まずアダプターのコンストラクターで元のリストのダミー/コピーを作成し、このダミーを使用してデータを復元してください。

希望すると、これで問題は解決します。

1

私の主な問題は、Listを操作していることです。アダプターにはデータが入っていますが、元のデータセットの「コピー」はありません。あなたは継続的にあなたがplistarrayをクリアして、再度レコードを検索するために同じを使用しているfilter()方法でここにplistarray

をという名前の単一array上で動作している

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

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

関連する問題