[英]NotifyDataSetChanged() isn't showing the updated list
我在 publishResults() function 的过滤列表中得到正确的对象,但过滤后的过滤列表未显示在屏幕上。 以下是从 ArrayAdapter class 继承的 CityAdapter class 的代码。 它似乎 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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.