Фильтр не обновляет список при удалении символов - PullRequest
0 голосов
/ 18 мая 2019

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

Мой класс адаптера:

public class CustomAdapter extends BaseAdapter implements Filterable {
private Context mContext;
private LayoutInflater inflater;

// ArrayList<String> gyms;
//ArrayList<String> gymsPlace ;
private List<Gyms> gymsList;
private List<Gyms> arrayList;

private List<Gyms> gymsList2;

public CustomAdapter(Context context, List<Gyms> gymsList) {
    mContext = context;
    this.gymsList = gymsList;
    inflater = LayoutInflater.from(mContext);
    //this.arrayList = new ArrayList<Gyms>();
    //this.arrayList.addAll(gymsList);
    gymsList2 = new ArrayList<>(gymsList);

}


public class ViewHolder {
    TextView item, subItem;
}

@Override
public int getCount() {
    return gymsList.size();
}

@Override
public Object getItem(int i) {
    return gymsList.get(i);
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(final int position, View view, ViewGroup parent) {

    final ViewHolder holder;
    if (view == null) {


        holder = new ViewHolder();

        view = inflater.inflate(R.layout.activity_list_item, null);
        holder.item = view.findViewById(R.id.item);
        holder.subItem = view.findViewById(R.id.subitem);

        view.setTag(holder);

    } else {
        holder = (ViewHolder) view.getTag();
    }
    holder.item.setText(gymsList.get(position).getGym());
    holder.subItem.setText(gymsList.get(position).getLocation());
    //Log.i("Tamanho", String.valueOf(gymsList.size()));

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(mContext, GymInfo.class);
            intent.putExtra("gymName", gymsList.get(position).getGym());
            intent.putExtra("location", gymsList.get(position).getLocation());
            mContext.startActivity(intent);
        }
    });
    return view;
}

@Override
public Filter getFilter() {
    return filter;
}
private Filter filter = new Filter() {


    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        List<Gyms> filteredList = new ArrayList<>();
       // gymsList2 = new ArrayList<Gyms>(gymsList);

        Log.i("Gyms", gymsList.toString());
        if (constraint == null || constraint.length() == 0) {
            filteredList.addAll(gymsList);
        } else {
            String filterPattern = constraint.toString().toLowerCase().trim();
            for (Gyms item : gymsList) {
                if (item.getGym().toLowerCase().contains(filterPattern)) {
                    filteredList.add(item);
                }
            }
        }
        FilterResults results = new FilterResults();
        results.values = filteredList;

        return results;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        gymsList.clear();
        gymsList.addAll((List) results.values);
        notifyDataSetChanged();
    }
};

}

, когда я начинаю удаление, список gymsList пуст.Спортивные залы: [] Я использую это с фрагментами.Все работает нормально, пока я не начну удалять символы.Если вернуться в мой список фрагментов, он ничего не показывает или показывает то, что я искал.

Может кто-нибудь дать мне подсказку?

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

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

 @Override
public boolean onQueryTextChange(String newText) {
    //customAdapter.getFilter().filter(newText);




    String userInput = newText.toLowerCase();
    ArrayList<Gyms> newList = new ArrayList<>();

    for(Gyms gym :gyms1){
        if(gym.getGym().toLowerCase().contains(userInput)|| gym.getLocation().toLowerCase().contains(userInput)){
            newList.add(gym);
        }


    }

    customAdapter.updateList(newList);

    return true;
}

В классе адаптера:

public void updateList(ArrayList<Gyms> newList) {
    Log.i("String:", newList.toString());

    gymsList = new ArrayList<>();
    gymsList.addAll(newList);


    notifyDataSetChanged();
}
0 голосов
/ 18 мая 2019

Я считаю, что ваша проблема заключается в том, что вы по существу удаляете объекты из исходного списка, когда начинаете вводить символы. Когда вы затем удаляете символы из вашего фильтра, оригинальные элементы, которые будут соответствовать вашему более короткому фильтру, уже удалены из списка, поэтому вы не сможете вернуть их обратно.

Я бы предложил добавить второй список в ваш адаптер, который вы используете для отображения элементов. Затем в вашем методе publishResults вы должны очистить и добавить результаты фильтра во второй список вместо исходного gymsList .

.
...