Как фильтровать данные в адаптере области?

Я столкнулся с проблемой фильтрации данных в адаптере области. Я создаю searchview для поиска данных, фильтруя данные в адаптере realm.

Мой код для реализации searchview

@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main_menu, menu); final MenuItem item = menu.findItem(R.id.action_search); final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item); Log.e("Filter ","Filtering"); searchView.setOnQueryTextListener(this); MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do something when collapsed adapter.setFilter(realmPhonecallList); Log.e("Filter 1","Filtering"); return true; // Return true to collapse action view } @Override public boolean onMenuItemActionExpand(MenuItem item) { // Do something when expanded return true; // Return true to expand action view } }); } @Override public boolean onQueryTextSubmit(String newText) { return true; } @Override public boolean onQueryTextChange(String newText) { final List filteredModelList = filter(realmPhonecallList, newText); Log.e("Filter 2","Filtering" + newText); adapter.setFilter(filteredModelList); Log.e("Filter 3","Filtering" + filteredModelList); return true; } private List filter(List models, String query) { query = query.toLowerCase(); final List filteredModelList = new ArrayList(); for (RealmPhoneCallLogs model : models) { final String text = model.getNumber().toLowerCase(); if (text.contains(query)) { filteredModelList.add(model); } } Log.e("Filter 4","Filtering" + filteredModelList); return filteredModelList; } 

Моя реализация адаптера

 private class MyNamesAdapter extends RealmBaseAdapter { List filter; public MyNamesAdapter(OrderedRealmCollection data) { super(data); this.filter = data; } public class ViewHolder { TextView number; TextView callType; TextView startTime; TextView contactName; TextView callDuration; TextView fileSize; ImageView contactPhoto; ImageView callSymbol; } @Override public View getView(int position, View convertView, ViewGroup parent) { final RealmPhoneCallLogs realmPhoneCallLogs = getItem(position); ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(); LayoutInflater inflater = LayoutInflater.from(getContext()); convertView = inflater.inflate(R.layout.calllog_layout, parent, false); viewHolder.number = (TextView) convertView.findViewById(R.id.missedNumber); viewHolder.startTime = (TextView) convertView.findViewById(R.id.missedStartTime); viewHolder.contactName = (TextView) convertView.findViewById(R.id.missedContactName); viewHolder.callDuration = (TextView) convertView.findViewById(R.id.missedCallDuration); viewHolder.fileSize = (TextView) convertView.findViewById(R.id.missedFileSize); viewHolder.contactPhoto = (ImageView) convertView.findViewById(R.id.missedImage); viewHolder.callSymbol = (ImageView) convertView.findViewById(R.id.callSymbol); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } if (adapterData != null) { viewHolder.number.setText(realmPhoneCallLogs.getNumber()); viewHolder.contactName.setText(getContactName(realmPhoneCallLogs.getNumber())); viewHolder.callDuration.setText(getTime(realmPhoneCallLogs.getCallDuration())); viewHolder.startTime.setText(realmPhoneCallLogs.getStartTime()); viewHolder.contactPhoto.setImageBitmap(getContactsImage(realmPhoneCallLogs.getNumber())); String path = new String(Environment.getExternalStorageDirectory() + "/NewCallLogs/" + realmPhoneCallLogs.getCallRecords()); File file = new File(path); String size; long filesize = file.length(); long fileSizeInKB = filesize / 1024; long fileSizeInMB = fileSizeInKB / 1024; if(fileSizeInKB >=1024){ size= fileSizeInMB + " Mb"; }else { size = fileSizeInKB + " Kb"; } if(!size.isEmpty()){ viewHolder.fileSize.setText(size); }else{ viewHolder.fileSize.setText(0); } if (realmPhoneCallLogs.getCallType().equals("I")) { viewHolder.callSymbol.setImageResource(R.mipmap.call_received); } else if (realmPhoneCallLogs.getCallType().equals("O")) { viewHolder.callSymbol.setImageResource(R.mipmap.call_made); } else if (realmPhoneCallLogs.getCallStatus().equals("UA")) { viewHolder.callSymbol.setImageResource(R.mipmap.call_missed); } return convertView; } return convertView; } public void setFilter( List filtedData) { filter = new ArrayList(); filter.addAll(filtedData); notifyDataSetChanged(); } } 

Пожалуйста, помогите мне, как фильтровать данные в области.

2 Solutions collect form web for “Как фильтровать данные в адаптере области?”

 public void setFilter( List filtedData) { filter = new ArrayList<>(); // < -- WRONG filter.addAll(filtedData); // <-- WRONG private List filter(List models, String query) { query = query.toLowerCase(); final List filteredModelList = new ArrayList<>(); // < -- WRONG for (RealmPhoneCallLogs model : models) { // <-- WRONG final String text = model.getNumber().toLowerCase(); if (text.contains(query)) { // <-- WRONG: should be Realm query 

Вместо этого вам нужно сделать

 // from https://stackoverflow.com/a/33818311/2413303 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { adapter.getFilter().filter(query); return false; } @Override public boolean onQueryTextChange(String newText) { if (searchView.getQuery().length() == 0) { adapter.getFilter().filter(""); } return false; } }); 

Затем, как и в связанном ответе

 private class MyNamesAdapter extends RealmBaseAdapter implements Filterable { public MyNamesAdapter(OrderedRealmCollection data) { super(data); } public class ViewHolder { TextView number; TextView callType; TextView startTime; TextView contactName; TextView callDuration; TextView fileSize; ImageView contactPhoto; ImageView callSymbol; } @Override public View getView(int position, View convertView, ViewGroup parent) { final RealmPhoneCallLogs realmPhoneCallLogs = getItem(position); ViewHolder viewHolder; if(convertView == null) { viewHolder = new ViewHolder(); LayoutInflater inflater = LayoutInflater.from(getContext()); convertView = inflater.inflate(R.layout.calllog_layout, parent, false); viewHolder.number = (TextView) convertView.findViewById(R.id.missedNumber); viewHolder.startTime = (TextView) convertView.findViewById(R.id.missedStartTime); viewHolder.contactName = (TextView) convertView.findViewById(R.id.missedContactName); viewHolder.callDuration = (TextView) convertView.findViewById(R.id.missedCallDuration); viewHolder.fileSize = (TextView) convertView.findViewById(R.id.missedFileSize); viewHolder.contactPhoto = (ImageView) convertView.findViewById(R.id.missedImage); viewHolder.callSymbol = (ImageView) convertView.findViewById(R.id.callSymbol); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } if(adapterData != null) { viewHolder.number.setText(realmPhoneCallLogs.getNumber()); viewHolder.contactName.setText(getContactName(realmPhoneCallLogs.getNumber())); viewHolder.callDuration.setText(getTime(realmPhoneCallLogs.getCallDuration())); viewHolder.startTime.setText(realmPhoneCallLogs.getStartTime()); viewHolder.contactPhoto.setImageBitmap(getContactsImage(realmPhoneCallLogs.getNumber())); String path = new String(Environment.getExternalStorageDirectory() + "/NewCallLogs/" + realmPhoneCallLogs .getCallRecords()); File file = new File(path); String size; long filesize = file.length(); long fileSizeInKB = filesize / 1024; long fileSizeInMB = fileSizeInKB / 1024; if(fileSizeInKB >= 1024) { size = fileSizeInMB + " Mb"; } else { size = fileSizeInKB + " Kb"; } if(!size.isEmpty()) { viewHolder.fileSize.setText(size); } else { viewHolder.fileSize.setText(0); } if("I".equals(realmPhoneCallLogs.getCallType())) { viewHolder.callSymbol.setImageResource(R.mipmap.call_received); } else if("O".equals(realmPhoneCallLogs.getCallType())) { viewHolder.callSymbol.setImageResource(R.mipmap.call_made); } else if("UA".equals(realmPhoneCallLogs.getCallStatus())) { viewHolder.callSymbol.setImageResource(R.mipmap.call_missed); } return convertView; } return convertView; } // filtering public void filterResults(String text) { text = text == null ? null : text.toLowerCase().trim(); if(text == null || "".equals(text)) { updateData(realm.where(RealmPhoneCallLogs.class).findAllSorted("id"); } else { updateData(realm.where(RealmPhoneCallLogs.class) .contains("number", text, Case.INSENSITIVE) .findAllSorted("id")); } } public Filter getFilter() { return new MyNamesFilter(this); } private class MyNamesFilter extends Filter { private final MyNamesAdapter adapter; private MyNamesFilter(MyNamesAdapter adapter) { super(); this.adapter = adapter; } @Override protected FilterResults performFiltering(CharSequence constraint) { return new FilterResults(); } @Override protected void publishResults(CharSequence constraint, FilterResults results) { adapter.filterResults(constraint.toString()); } } } 

Для фильтрации Realm вы также можете проверить официальную документацию по запросам .

Ниже приведен пример фильтруемого RecyclerView с Realm:
как реализовать фильтрацию в RealmRecyclerViewAdapter

Вот проблема:
https://github.com/realm/realm-java/issues/646

  • Android java.net.UnknownHostException: Хост не решен (вопрос страtagsи)
  • Как использовать интерфейс для связи между двумя действиями
  • Диалоговое окно предупреждения о дизайне материалов
  • Зачем использовать Fragment # setRetainInstance (boolean)?
  • Файл SharedPreferences
  • Получить программную модель Android Phone
  • Отправка сообщения через WhatsApp
  • Как исправить ошибку android 4.4.2 ClassNotFoundException: не нашел class «com.google.firebase.provider.FirebaseInitProvider» по пути: DexPathList
  • Как установить все приложение только в портретном режиме?
  • Как изменить имя пакета приложения для Android
  • Android GCM: тот же идентификатор отправителя для большего количества приложений
  • Interesting Posts

    Как получить файлы из резервных копий Time Machine с другого компьютера?

    автоматически сбрасывать все таблицы mysql в отдельные файлы?

    Как вручную загрузить потоковое видео (Firefox)

    Переход на добавление уникального ограничения на комбинацию столбцов

    Почему я получаю символ глаза на своих почтовых учетных записях в полях пароля в Internet Explorer?

    Как я могу изменить или удалить сообщения об ошибках в форме HTML5 по умолчанию?

    Шифровать пароль в App.config

    Linq-запрос или выражение Lambda?

    установка минимальной даты в jquery datepicker

    добавить параметры jvm в tomcat

    Почему мой системный процесс делает диск IO?

    Как выполнить долговременную задачу в ASP.NET 4?

    Получить отпечаток сертификата от приложения android

    Почему у меня уже есть 4 первичных раздела, и какой (если есть) я могу перейти на логический?

    Есть ли программа для изучения интернет-использования для каждого компьютера в сети?

    Давайте будем гением компьютера.