我正在使用带有可过滤界面的 ArrayAdapter 来实现listview中的搜索功能。我的适配器代码如下:
public class FlightsAdapter extends ArrayAdapter<Flight> implements Filterable {
List<Flight> flightLists = new ArrayList<Flight>();
private List<Flight> origFlightList;
private Context context;
Flight flight = null;
public FlightsAdapter(Context context, int textViewResourceId,
List<Flight> fLists) {
super(context, textViewResourceId, fLists);
this.context = context;
this.flightLists = fLists;
}
public void updateFlightList(List<Flight> newData){
this.flightLists.clear();
this.flightLists = newData;
}
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
final FilterResults oReturn = new FilterResults();
final List<Flight> results = new ArrayList<Flight>();
if (origFlightList == null)
origFlightList = flightLists;
if (constraint != null) {
if (origFlightList != null && origFlightList.size() > 0) {
for (final Flight f : origFlightList) {
if (f.getPlace().toLowerCase()
.contains(constraint.toString()))
results.add(f);
}
}
oReturn.values = results;
oReturn.count = results.size();
}
return oReturn;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
flightLists = (ArrayList<Flight>) results.values;
notifyDataSetChanged();
}
};
}
}
getFilter()和 publishResults()方法会在搜索时正确触发, flightLists 会填充新数据但listview保持不变没有项目改变,我不知道我在上面的代码中做错了什么,请帮我弄清楚这个问题
答案 0 :(得分:3)
这是问题
flightLists = (ArrayList<Flight>) results.values;
将其替换为
flightLists.clear();
flightLists.addAll((ArrayList<Flight>) results.values);
看看是否能解决您的问题。
稍后编辑(解释):
创建适配器时,为其提供了一个List对象。因此,适配器有一个引用指向该列表的引用,从中获取数据。
当您用其他整个内存块替换该引用时
flightLists = (ArrayList<Flight>) results.values;
适配器没有更新orignial数据集(从实际获取数据的位置开始)。因此,notifyDataSetChanged()没有工作。
更新适配器中的数据时,必须保持原始数据结构引用不变。清除和填充其他数据集是一种选择。重新实例化(以任何方式)都不是。
这是基本的java。