删除字符时过滤器不更新列表

时间:2019-05-18 15:47:55

标签: android android-fragments filter searchview

当我输入字符时,过滤器可以正常工作。 但是,当我删除其中一些时,它不会更新。 因此,如果过滤器没有更新,则列表也不会更新,并且会显示我之前搜索过的对象。

我的适配器类:

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 :(得分:0)

我相信您的问题是,当您开始输入字符时,实际上是在从原始列表中删除对象。然后,当您从过滤器中删除字符时,与现在较短的过滤器匹配的原始项已从列表中删除,因此您无法找回它们。

我建议您在适配器中添加第二个列表,用于显示项目。然后,在您的 publishResults 方法中,您将清除过滤器结果并将其添加到第二个列表中,而不是原始的 gymsList

答案 1 :(得分:0)

我发现了其他可行的方法。 在片段/活动中:

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