Search code examples
androidandroid-fragmentsfiltersearchview

Filter does not update list when I delete chars


When I enter characters, the filter works fine. But When I delete some of them it does not update. So, if the filter does not update, the list will not update too and it shows the object that I've searched before.

My adapter class:

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();
    }
};

}

when I start deleting, the gymsList is empty. Gyms: [] I am using it with fragments. It all runs ok until I start deleting chars. If return to my fragment list it shows nothing or shows what I've searched for.

Can some one give me a clue?


Solution

  • I found other way that works. In the fragment/activity:

     @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;
    }
    

    In the adapter class:

    public void updateList(ArrayList<Gyms> newList) {
        Log.i("String:", newList.toString());
    
        gymsList = new ArrayList<>();
        gymsList.addAll(newList);
    
    
        notifyDataSetChanged();
    }