У меня есть RecyclerView с простым списком имен на основе строк. Я добавил в свой класс инструменты Filterable, и я могу искать / фильтровать результаты, используя панель поиска. Проблема возникает при нажатии клавиши со стрелкой / ввода на программной клавиатуре. Когда вы делаете это, он полностью отменяет поиск и возвращается к полному списку имен. Я искал примеры использования класса Filterable и полностью согласен со всеми результатами, которые видел. Я просто не могу понять, как сделать так, чтобы это не отменялось при нажатии на кнопку галочки / ввода на клавиатуре.
Фильтрация работает, как вы можете видеть, но эта чертова клавиша со стрелкой отменяет результаты поиска и возвращает меня к полному списку.
Вот соответствующие части кода, если это необходимо ...
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 ...