Фильтруется с помощью специального адаптера
Я пытался реализовать Filterable с помощью специального адаптера для searchView. Я пробовал следующий код, но он не работает. Когда я пишу в поиске, он показывает неправильный результат. Я использовал мой поиск в панели действий.
Не могли бы вы объяснить и показать, как реализовать Filterable с помощью специального адаптера?
public class MyCustoadapter extends ArrayAdapter<String> implements Filterable {
private List<String> originalData = null;
private List<String> filteredData = null;
private LayoutInflater mInflater;
private CustomFilter mFilter = new CustomFilter();
public MyCustoadapter(Context context, int textViewResourceId,
ArrayList<String> objects) {
super(context, textViewResourceId, objects);
this.filteredData = objects;
this.originalData = objects;
}
public int getCount() {
return filteredData.size();
}
public String getItem(int position) {
return filteredData.get(position);
}
public long getItemId(int position) {
return position;
}
public Filter getFilter() {
return mFilter;
}
private class CustomFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final List<String> list = originalData;
int count = list.size();
final ArrayList<String> nlist = new ArrayList<String>(count);
String filterableString;
for (int i = 0; i < count; i++) {
filterableString = list.get(i);
if (filterableString.toLowerCase().contains(filterString)) {
nlist.add(filterableString);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredData = (ArrayList<String>) results.values;
notifyDataSetChanged();
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.activity_list_view, parent, false);
TextView storyNameV = (TextView) view.findViewById(R.id.storyName);
storyNameV.setText(story[position]);
return view;
}
}
}
Код представления поиска выглядит следующим образом:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.about, menu);
// creating search bar at the action bar
MenuItem item =menu.findItem(R.id.search_story);
SearchView searchView= (SearchView) item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
// Return true to display menu
return super.onCreateOptionsMenu(menu);
}
Например, у меня есть эти элементы в массиве строк
<item>"The Boarded Window"</item>
<item>"A Coward"</item>
<item>"The Door"</item>
Когда я набираю "а", он должен был показывать "Показ труса", но это не так. Но если я использую простой адаптер, а не пользовательский адаптер, он работает нормально.