如何解决NotifyDataSetChanged() 未显示更新的列表
我在 publishResults() 函数的过滤列表中得到了正确的对象,但过滤后的列表没有显示在屏幕上。 以下是从 ArrayAdapter 类继承的 CityAdapter 类的代码。 它似乎notifyDataSetChanged() 不起作用? 请告知为什么列表没有显示。代码有什么问题。
import...
public class CityListAdapter extends ArrayAdapter<City> implements Filterable {
private ArrayList<City> cities;
private ArrayList<City> filtered_list;
public CityListAdapter(Context context,int resource,ArrayList<City>cities) {
super(context,resource,cities);
this.cities = cities;
}
@NonNull
@Override
public View getView(int position,@Nullable View convertView,ViewGroup parent) {
Holder holder = new Holder();
if(convertView == null) {
LayoutInflater inflator = LayoutInflater.from(getContext());
convertView = inflator.inflate(R.layout.adapter_view,parent,false);
holder.box = (CheckBox) convertView.findViewById(R.id.checkBox);
holder.name = (TextView) convertView.findViewById(R.id.textView);
convertView.setTag(holder);
}
else {
holder = (Holder) convertView.getTag();
}
City city = getItem(position) ;
holder.name.setText(city.getName());
return convertView;
}
private class Holder {
CheckBox box;
TextView name;
}
@NonNull
@Override
public Filter getFilter() {
return new CityFilter();
}
private class CityFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
filtered_list = new ArrayList<>();
if (constraint != null && constraint.length()!= 0) {
for (int i = 0; i < cities.size(); i++) {
if (cities.get(i).getName().contains(constraint)) {
filtered_list.add(cities.get(i));
showMessage(cities.get(i).getName() + "added");
}
}
}
results.values = filtered_list;
results.count = filtered_list.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
filtered_list = (ArrayList<City>) results.values;
int size =filtered_list.size();
showMessage("Data set changed"+String.format("%d",size));
notifyDataSetChanged();
}
}
public void showMessage(String message) {
Toast toast = Toast.makeText(getContext(),message,Toast.LENGTH_LONG);
toast.show();
}
}
解决方法
您需要在最开始(即在构造函数中)分配给过滤列表的项目的完整列表;这样他们就可以在没有过滤结果(空搜索)时拥有整个列表,并且在您实例化适配器时会发生这种情况。
public CityListAdapter(Context context,int resource,ArrayList<City>cities) {
super(context,resource,cities);
this.cities = cities;
this.filtered_list = cities; // <<<<< Change here
}
附注
同时覆盖 getCount()
以避免在滚动时到达列表末尾时出现 IndexOutOfBoundsException
,只要原始列表大小不等于过滤后的列表大小。
由于原始列表是cities
,当你进行过滤时,它的大小会缩小,所以你只需要得到过滤后的列表大小而不是原始列表大小就可以避免IndexOutOfBoundsException
。>
因此将其添加到适配器中:
@Override
public int getCount() {
return filtered_list.size();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。