Intereting Posts
Android Studio / Gradle build не может найти пользовательский класс приложения Текстовая цветная анимация Загрузка больших изображений без OutOfMemoryError Как установить PNG-файл в ImageView? Студия Android, использующая> 100% процессор во все времена – фоновые процессы не работают Как получить текущий buildType в конфигурации Android Gradle Как установить выходное изображение, используйте com.android.camera.action.CROP Внедрение CustomArrayAdapter: невозможно получить идентификатор ресурса Библиотека поддержки Xamarin Android v4 (неполная)? Адаптер Viewpager getItem всегда вызывается для индекса 0 и 1 Как активировать действие с помощью локального уведомления, созданного из удаленного уведомления Можно добавлять элементы ListView без использования адаптера? Слишком громоздкий для отображения статического массива Как я могу получить правильные DisplayMetrics из AppWidget в Android? Уникальность упаковки для приложений? Масштаб изображения без потери качества изображения не работал

Фильтр ListView Filter правильно, но показывает неправильный результат

У меня есть пользовательский Adapter который я использую для отображения пользовательских объектов в ListView . Кроме того, я использовал SearchView который позволяет мне просматривать результаты ListView и фильтровать результаты. Однако, когда я пытаюсь ввести поиск, я заметил какое-то странное поведение. Пока я ищу элемент, который находится в списке, элемент будет отображаться в фильтре, однако элементы всегда отображаются в верхней части списка. Если в списке 10 элементов, и поиск производит 5 совпадений, тогда результат отобразит первые 5 элементов в списке вместо 5 фактических совпадений. Например, рассмотрите этот список с 6 мотоциклетными шлемами на нем:

  • колокол
  • Значок
  • Харли-Девидсон
  • Джо Ракет
  • Shoei
  • Тор

Если я ищу «ho», итоговый список должен быть следующим:

  • S ho ei
  • T ho r

Тем не менее, список, который я получаю, это первые два элемента:

  • колокол
  • Значок

Я не могу понять, почему поиск работает неправильно. Любая помощь будет оценена по достоинству. Мой код показан ниже …

HelmetActivity.java

 public class HelmetActivity extends ActionBarActivity implements SearchView.OnQueryTextListener{ private Menu menu; private ListView listView; private HelmetAdapter helmetAdapter; private List<Helmet> arrayList; private SearchManager searchManager; private SearchView searchView; private MenuItem searchMenuItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.helmet_activity); ActionBar actionBar = getSupportActionBar(); actionBar.setElevation(0); listView = (ListView) findViewById(R.id.helmet_listview); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); arrayList = new ArrayList<Helmet>(); listView.setLongClickable(true); helmetAdapter = new HelmetAdapter(this, R.layout.helmet, arrayList); listView.setAdapter(helmetAdapter); arrayList.add(new Helmet("Bell")); arrayList.add(new Helmet("Icon")); arrayList.add(new Helmet("Harley Davidson")); arrayList.add(new Helmet("Joe Rocket")); arrayList.add(new Helmet("Shoei")); arrayList.add(new Helmet("Thor")); } @Override public boolean onCreateOptionsMenu(Menu menu) { this.menu = menu; MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.helmet_activity_menu, menu); SearchManager searchManager = (SearchManager) getSystemService( Context.SEARCH_SERVICE); searchMenuItem = menu.findItem(R.id.action_search); searchView = (SearchView) searchMenuItem.getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo( getComponentName())); searchView.setSubmitButtonEnabled(true); searchView.setOnQueryTextListener(HelmetActivity.this); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { helmetAdapter.getFilter().filter(newText); return true; } } 

HelmetAdapter.java

 public class HelmetAdapter extends ArrayAdapter<Helmet> implements Filterable { private int resource; private LayoutInflater inflater; private Context context; private List<Helmet> helmetList; private List<Helmet> filteredHelmetList; private HelmetFilter helmetFilter; public HelmetAdapter (Context pContext, int pResource, List<Helmet> helmetList) { super (pContext, pResource, helmetList); resource = pResource; inflater = LayoutInflater.from (pContext); context = pContext; this.helmetList = helmetList; this.filteredHelmetList = helmetList; getFilter(); } @Override public View getView (final int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(resource, parent, false); } String uri; int imageResource; Drawable image; Helmet helmet = getItem (position); TextView hName = (TextView) convertView.findViewById(R.id.h_name); hName.setText(helmet.getName()); return convertView; } @Override public int getCount() { return filteredHelmetList.size(); } @Override public Filter getFilter() { if (helmetFilter == null) { helmetFilter = new HelmetFilter(); } return helmetFilter; } private class HelmetFilter extends Filter { @Override protected FilterResults performFiltering (CharSequence constraint) { FilterResults filterResults = new FilterResults(); if (constraint != null && constraint.length() > 0) { ArrayList<Helmet> temporaryHelmetList = new ArrayList<Helmet>(); for (Helmet helmet : helmetList) { if (helmet.getName().toLowerCase().contains(constraint.toString() .toLowerCase())) { temporaryHelmetList.add(helmet); } } filterResults.count = temporaryHelmetList.size(); filterResults.values = temporaryHelmetList; } else { filterResults.count = helmetList.size(); filterResults.values = helmetList; } return filterResults; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { filteredHelmetList = (ArrayList<Helmet>) results.values; notifyDataSetChanged(); } } } 

Helmet.java

 public class Helmet { public Helmet (String name) { super(); this.name = name; } private String name; public String getName () { return name; } public void setName (String pName) { this.name = pName; } } 

Мне кажется, что ваша проблема, скорее всего, лежит в getView(..) вашего адаптера.

Эта линия в частности –

 Helmet helmet = getItem (position); 

Если вы возвращаете элемент в исходном массиве шлемов, это объясняет, почему вы получаете результаты. Однако я не могу быть уверен, потому что я не вижу ваш метод getItem(..) размещенный в вашем коде. Если это действительно так, то, конечно, вы хотели бы возвращать отфильтрованные результаты здесь (если они есть), а не из нефильтрованного списка.