notifyDataSetChanged 方法不使用更新的数据刷新列表视图?
notifyDataSetChanged method is not refreshing listview using updated data?
我正在使用带有 filterable 接口的 ArrayAdapter 在 listview.My 适配器代码中实现搜索功能如下:
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 时正确触发填充了新数据,但列表视图保持不变,没有项目更改,我不知道我在上面的代码中做错了什么,请帮我解决这个问题
问题来了
flightLists = (ArrayList<Flight>) results.values;
将其替换为
flightLists.clear();
flightLists.addAll((ArrayList<Flight>) results.values);
看看是否能解决您的问题。
稍后编辑(解释):
当您创建适配器时,您给了它一个 List 对象。因此,适配器有一个指向该列表的引用,一个指针,它从那里获取要显示的数据。
当您用整个其他内存块替换该引用时
flightLists = (ArrayList<Flight>) results.values;
适配器没有更新原始数据集(从它实际获取数据以显示的地方)。因此,notifyDataSetChanged() 不起作用。
更新适配器中的数据时,您必须保持原始数据结构引用完好无损。清除和填充另一个数据集是一个选项。重新实例化它(以任何方式)不是。
这是基本的 java。
我正在使用带有 filterable 接口的 ArrayAdapter 在 listview.My 适配器代码中实现搜索功能如下:
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 时正确触发填充了新数据,但列表视图保持不变,没有项目更改,我不知道我在上面的代码中做错了什么,请帮我解决这个问题
问题来了
flightLists = (ArrayList<Flight>) results.values;
将其替换为
flightLists.clear();
flightLists.addAll((ArrayList<Flight>) results.values);
看看是否能解决您的问题。
稍后编辑(解释):
当您创建适配器时,您给了它一个 List 对象。因此,适配器有一个指向该列表的引用,一个指针,它从那里获取要显示的数据。
当您用整个其他内存块替换该引用时
flightLists = (ArrayList<Flight>) results.values;
适配器没有更新原始数据集(从它实际获取数据以显示的地方)。因此,notifyDataSetChanged() 不起作用。
更新适配器中的数据时,您必须保持原始数据结构引用完好无损。清除和填充另一个数据集是一个选项。重新实例化它(以任何方式)不是。
这是基本的 java。