Фильтруемый с RecyclerView отменяется при нажатии клавиши галочки на клавиатуре - PullRequest
0 голосов
/ 03 января 2019

У меня есть RecyclerView с простым списком имен на основе строк. Я добавил в свой класс инструменты Filterable, и я могу искать / фильтровать результаты, используя панель поиска. Проблема возникает при нажатии клавиши со стрелкой / ввода на программной клавиатуре. Когда вы делаете это, он полностью отменяет поиск и возвращается к полному списку имен. Я искал примеры использования класса Filterable и полностью согласен со всеми результатами, которые видел. Я просто не могу понять, как сделать так, чтобы это не отменялось при нажатии на кнопку галочки / ввода на клавиатуре. enter image description here

Фильтрация работает, как вы можете видеть, но эта чертова клавиша со стрелкой отменяет результаты поиска и возвращает меня к полному списку.

Вот соответствующие части кода, если это необходимо ...

public class VegetableListAdapter extends RecyclerView.Adapter<VegetableListAdapter.ViewHolder> implements Filterable {
//...
private ArrayList<VegetableName> allNames;
private ArrayList<VegetableName> filteredNames;

class ViewHolder extends RecyclerView.ViewHolder {
    public TextView name;

    public ViewHolder(View view) {
         super(view);
         name = view.findViewById(R.id.name);
         //...
    }
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    final VegetableName name = filteredNames.get(position);
    holder.name.setText(name.getName());
}

//...
@Override
public void getFilter() {
    return new Filter() {
         @Override
         protected FilterResults performFiltering(CharSequence charSequence) {
             FilterResults results = new FilterResults();
             String term = charSequence.toString();
             Log.d("VegetableListAdapter", "Searching for string: " + term);
             if(term.isEmpty()) {
                  filteredNames = allNames;
                  results.values = allNames;
                  results.count = allNames.size();
             } else {
                  ArrayList<VegetableName> filteredList = new ArrayList<>();
                  for(VegetableName name : allNames) {
                      if(name.getName().toLowerCase().contains(term.toLowerCase()) {
                      filteredList.add(name);
                  }
                  filteredNames = filteredList;
             }
             results.values = filteredNames;
             results.count = filteredNames.size();
             return results;
      }
      @Override
      protected void publishResults(CharSequence sequence, FilterResults results) {
          Log.d("VegetableListAdapter", "publishing results of: " + sequence);
          filteredNames = (ArrayList<VegetableName>) filterResults.values;
          notifyDataSetChanged();
     }
 };

}

Вызов фильтра выполняется в Упражнении здесь ...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.vegetable_list, menu);

    SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setSearchableInfo(manager.getSearchableInfo(getComponentName()));
    searchView.setMaxWidth(Integer.MAX_VALUE);

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            adapter.getFilter().filter(s);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            adapter.getFilter().filter(s);
            return false;
        }
    });
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if(id == android.R.id.home) {
        if(!searchView.isIconified()) {
            searchView.setIconified(true);
            return true;
        }
    }
    return id == R.id.action_search || super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    if(!searchView.isIconified()) {
        searchView.setIconified(true);
        return;
    }
    super.onBackPressed();
    overridePendingTransition(R.anim.slide_from_left, R.anim.slide_to_right);
}

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

Вывод Logcat из добавленных выше строк Log.d ... enter image description here

1 Ответ

0 голосов
/ 04 января 2019

Я нашел проблему.В учебнике, который я искал для этого, я добавил строку

searchView.setSearchableInfo(manager.getSearchableInfo(getComponentName()));

, которая добавляла клавишу со стрелкой к клавиатуре.При нажатии на то, что он использовал searchableInfo для поиска результатов, конечно, их не было, поэтому он просто возвращался к списку.Удаление этой строки превратило клавишу со стрелкой в ​​клавишу поиска, и теперь она работает отлично.Просто хотел опубликовать этот ответ на случай, если кто-нибудь еще столкнется с этой проблемой.

...