2016-08-29 2 views
2

привет, я разрабатываю одно приложение, где я реализовал просмотр и поиск в реплике в fregement.i, чтобы получить фильтр в первый раз в соответствии с изменением текста. Но когда я удаляю текст один за другим, весь список будет пустым. В конце может отображаться изображение.searchview с просмотром recycler не работает должным образом

Вот мой код из моего fragement

+0

использования [это] (https://gist.githubusercontent.com/pskink/cd3bbdd742b5b1905a790c76831b5d85/raw/89a41acded0889028be48e1f669562046cf66126/MatchableRVArrayAdapte%2520 (чистый% 2520RecyclerView% 2520style,% 2520no% 2520implicit% 2520TextView% 2520mapping)) generic adapter – pskink

ответ

1

Я думаю, что проблема в if (text.isEmpty()) { блоке filter метода.
Здесь вы очистить plistarray список и добавить, что пустой список в plistarray.addAll(plistarray);

Вместо этого добавьте оригинальный DataList для 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

Вы постоянно работают на одном array имени plistarray

здесь в filter() методе вы очистили plistarray и снова использовали тот же, чтобы найти записи. так что вы должны использовать другой массив для вас адаптера, а не 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

Смежные вопросы