Фильтр в SearchView не работает в Android

Я разрабатываю функцию поиска, в которой, если я ввожу ключевое слово для поиска в поиске в Android, я должен получить список студентов, соответствующих моему поисковому слову. Я написал код, но получил ошибку. Пожалуйста, дайте мне знать, если я правильно использую адаптер. моя функция onCreateOptionsMenu

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.options_menu, menu);
    SearchManager searchManager =(SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =(SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));



    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {

            StudentAdapter.getFilter().filter(newText);
            return true;

        }
    });

    return true;
}

Мой ученик Adapter класс:

public class StudentAdapter extends
    RecyclerView.Adapter<StudentAdapter.MyViewHolder> implements
    Filterable {

public List<StudentModel> new_list;
private List<StudentModel> original_list;

@Override
public Filter getFilter() {
    return new Filter() {
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                                      FilterResults results) {
            new_list = (List<StudentModel>) results.values;
            StudentAdapter.this.notifyDataSetChanged();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults initial_results = new FilterResults();

            if (constraint == null || constraint.length() == 0) {
                initial_results.values = original_list;
                initial_results.count = original_list.size();
            } else {

                // We perform filtering operation
                List<StudentModel> filteredList = new ArrayList<StudentModel>();

                // breaking string into words algorithm
                String str = constraint.toString();
                ArrayList<String> arrayOfWords = new ArrayList<String>();
                int i = 0;
                for (String word : str.split(" ")) {
                    arrayOfWords.add(word);
                    i++;
                }

                for (StudentModel model : original_list) {
                    boolean matched = false;

                    for (String element : arrayOfWords) {


                        if ((null != model.getName() && model
                                .getName().toUpperCase()
                                .contains(element.toString().toUpperCase()))


                                || ((null != model.getClass() && model
                                .getClass()
                                .toUpperCase()
                                .contains(
                                        element.toString()
                                                .toUpperCase())))) {
                            matched = true;
                        } else {
                            matched = false;
                            break;
                        }

                    }

                }

                initial_results.values = filteredList;
                initial_results.count = filteredList.size();

            }

            return initial_results;
        }
    };
    // return null;
}

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView name, class;

    public MyViewHolder(View view) {
        super(view);
        name = (TextView) view.findViewById(R.id.name);
        class = (TextView) view.findViewById(R.id.class);


    }
}

public StudentAdapter(List<StudentModel> original_list) {

    this.original_list = original_list;
}

public List<StudentModel> getStudentlist() {
    return original_list;
}

@Override
public StudentAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,
                                                       int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(
            R.layout.original_list_row, parent, false);

    return new StudentAdapter.MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(StudentAdapter.MyViewHolder holder,
                             int position) {
    StudentModel original_list_vo = original_list.get(position);

    holder.name.setText(original_list_vo.getName());
    holder.class.setText(original_list_vo.getClass());


}

@Override
public int getItemCount() {
    return original_list.size();
}

}

Любая помощь будет оценена, спасибо заранее.

1 ответ

Объявите свой вид поиска в onCreate следующим образом.

sv= (android.widget.SearchView) findViewById(R.id.searchViewid);    

sv.setIconifiedByDefault(false);
    sv.setOnQueryTextListener(this);
    sv.setSubmitButtonEnabled(true);
    sv.setQueryHint("Search Here");

Теперь перестаю пользоваться этими методами.

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public boolean onQueryTextChange(String newText)
{
    android.widget.Filter filter = YourAdapter.getFilter();
    if (TextUtils.isEmpty(newText)) {
        YourListView.clearTextFilter();
        YourAdapter.getFilter().filter("");
    } else {
        YourListView.setFilterText(newText);
    }
    filter.filter(newText);
    return true;
}

Попробуйте это и скажите, какой вывод приходит.

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