当我删除字符时过滤器不更新列表
Filter does not update list when I delete chars
当我输入字符时,过滤器工作正常。
但是当我删除其中一些时,它不会更新。
所以,如果过滤器不更新,列表也不会更新,它会显示我之前搜索过的对象。
我的适配器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();
}
};
}
当我开始删除时,gymsList 是空的。
健身房:[]
我将它与片段一起使用。
一切正常,直到我开始删除字符。
如果 return 到我的片段列表,它不显示任何内容或显示我搜索的内容。
谁能给我一个线索?
我认为您的问题在于,当您开始输入字符时,您实际上是在从原始列表中删除对象。当您随后从过滤器中删除字符时,与您现在更短的过滤器相匹配的原始项目已经从列表中删除,因此您无法取回它们。
我建议在您用于显示项目的适配器中添加第二个列表。然后在您的 publishResults 方法中,您将清除过滤器结果并将其添加到第二个列表而不是原始的 gymsList.
我找到了其他可行的方法。
在 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;
}
在适配器中 class:
public void updateList(ArrayList<Gyms> newList) {
Log.i("String:", newList.toString());
gymsList = new ArrayList<>();
gymsList.addAll(newList);
notifyDataSetChanged();
}
当我输入字符时,过滤器工作正常。 但是当我删除其中一些时,它不会更新。 所以,如果过滤器不更新,列表也不会更新,它会显示我之前搜索过的对象。
我的适配器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();
}
};
}
当我开始删除时,gymsList 是空的。 健身房:[] 我将它与片段一起使用。 一切正常,直到我开始删除字符。 如果 return 到我的片段列表,它不显示任何内容或显示我搜索的内容。
谁能给我一个线索?
我认为您的问题在于,当您开始输入字符时,您实际上是在从原始列表中删除对象。当您随后从过滤器中删除字符时,与您现在更短的过滤器相匹配的原始项目已经从列表中删除,因此您无法取回它们。
我建议在您用于显示项目的适配器中添加第二个列表。然后在您的 publishResults 方法中,您将清除过滤器结果并将其添加到第二个列表而不是原始的 gymsList.
我找到了其他可行的方法。 在 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;
}
在适配器中 class:
public void updateList(ArrayList<Gyms> newList) {
Log.i("String:", newList.toString());
gymsList = new ArrayList<>();
gymsList.addAll(newList);
notifyDataSetChanged();
}