Фильтруется с помощью специального адаптера

Я пытался реализовать 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>

Когда я набираю "а", он должен был показывать "Показ труса", но это не так. Но если я использую простой адаптер, а не пользовательский адаптер, он работает нормально.

0 ответов

Другие вопросы по тегам