#android #android-recyclerview #searchview
#Android #android-recyclerview #searchview
Вопрос:
В моем приложении есть адаптер данных со скрытыми элементами recyclerview. Я создал функцию фильтра для поиска значений в списке. Первый поиск всегда показывает правильные значения запроса. Но при следующем поиске не отображаются искомые значения. Я понял, что если я сверну и снова открою searchview, проблема исчезнет. Но только для второго и следующего поиска … P.S Такой ситуации не существует, если элементы recyclerview не скрыты.
Я отправляю свою OnBindViewHolder
функцию из адаптера и функцию поиска из activity.
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.CustomViewHolder> {
private List<ModelData> ModelList;
private List<ModelData> ListFull;
private Context mContext;
private boolean activate=false;
public DataAdapter(List<ModelData> ModelList, Context mCtx) {
this.ModelList = ModelList;
this.mContext = mCtx;
ListFull = new ArrayList<>(ModelList);
public void onBindViewHolder(final CustomViewHolder holder, int position) {
final ModelData result = ModelList.get(position);
holder.status.setText(result.getStatus());
if(holder.status.getText().equals("YYY")amp;amp; !activate){
holder.itemView.setVisibility(View.GONE);
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
}
if(holder.status.getText().equals("YYY") amp;amp; activate){
holder.itemView.setVisibility(View.VISIBLE);
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
}
}
@Override
public int getItemCount() {
return ModelList.size();
}
public Filter getFilter() {
return exampleFilter;
}
private Filter exampleFilter= new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<ModelData> filteredList= new ArrayList<>();
if(constraint== null || constraint.length()==0){
filteredList.addAll(ListFull);
}else{
String filePattern= constraint.toString().toLowerCase().trim();
for(ModelData ModelData: ListFull){
if(ModelData.getEventLabel().toLowerCase().contains(filePattern)){
filteredList.add(ModelData);
}
}
}
FilterResults filterResults= new FilterResults();
filterResults.values= filteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
ModelList.clear();
ModelList.addAll((List)results.values);
notifyDataSetChanged();
}
};
}
Активность
@Override
public void onCreateOptionsMenu(@NonNull final Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menuLayout, menu);
this.menu = menu;
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint("type something");
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
biezaceAwarieAdapter.getFilter().filter(newText);
ImageView searchViewIcon = searchView.findViewById(R.id.search_close_btn);
searchViewIcon.setVisibility(View.GONE);
return false;
}
});
super.onCreateOptionsMenu(menu, inflater);
}
Ответ №1:
Сделайте это:
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.CustomViewHolder> implements Filterable{
Измените свой для каждого цикла:
for(ModelData ModelData: ListFull)
Для
for(ModelData modeldata: ListFull)
Новый код должен быть:
String filePattern= constraint.toString().toLowerCase().trim();
for(ModelData modeldata: ListFull){
if(modeldata.getEventLabel().toLowerCase().contains(filePattern)){
filteredList.add(modeldata);
}
}
Комментарии:
1. Не могли бы вы рассказать мне, как это изменение может помочь?
2. Реальная проблема в том, что вы не внедрили Filterable в свой DataAdapter.
3. Проверьте мой обновленный ответ. На этот раз он будет работать в Sha Allah