【问题标题】:notifyDataSetChanged method is not refreshing listview using updated data?notifyDataSetChanged 方法不使用更新的数据刷新列表视图?
【发布时间】:2015-08-04 12:48:11
【问题描述】:

我正在使用带有 filterable 接口的 ArrayAdapter 在列表视图中实现搜索功能。我的适配器代码如下:

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 会填充新数据,但列表视图与没有项目改变,我不知道我在上面的代码中做错了什么,请帮我解决这个问题

【问题讨论】:

  • 你试过 notifyDataSetInvalide() 吗?
  • @KarnShah 是的,但完全没有变化 :(

标签: android listview android-arrayadapter


【解决方案1】:

问题来了

 flightLists = (ArrayList<Flight>) results.values;

替换为

flightLists.clear();
flightLists.addAll((ArrayList<Flight>) results.values);

看看这是否能解决您的问题。

后期编辑(解释):

当你创建你的适配器时,你给了它一个 List 对象。因此,适配器有一个指向该 List 的引用、一个指针,它从该 List 中获取要显示的数据。

当您将该引用替换为整个其他内存块时

flightLists = (ArrayList<Flight>) results.values;

适配器没有更新原始数据集(从它实际获取数据显示的位置)。因此,notifyDataSetChanged() 不起作用。

更新适配器中的数据时,您必须保持原始数据结构引用不变。清除和填充另一个数据集是一种选择。 (以任何方式)重新实例化它不是。

这是基本的java。

【讨论】:

  • 它可以工作,但我想了解我的代码有什么问题,你能解释一下吗?
  • 感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多