在ListAdapter(ListView)中重新填充数据的最佳方法

时间:2011-10-02 13:22:32

标签: java android list listview adapter

我确实使用此代码在更改后用数据重新填充ListView

// ListView lv;
// MyListAdapter la;
// DataClass dc;
dc.remove(object_id);
lv.setAdapter(la);

这是最好的方法,因为我们无法使用notifyDataSetChanged()中仅提供的ArrayAdapter吗?

解决方案

 //MyListAdapter.java

private ArrayList<DataSetObserver> observers = new ArrayList<DataSetObserver>();

public void registerDataSetObserver(DataSetObserver arg0) {
    observers.add(arg0);
}

public void unregisterDataSetObserver(DataSetObserver arg0) {
    observers.remove(arg0);
}

public void notifyDataSetChange() {
    for (DataSetObserver d : observers) {
        d.onChanged();
    }
}

public void remove(int position) {
    [DataClass object].remove(position);
    notifyDataSetChange();
} 

3 个答案:

答案 0 :(得分:3)

对于CursorAdapter我使用以下代码:

mAdapter.getCursor().requery();

如果您使用自定义适配器或您评论过:只需要ListAdapter作为成员变量。而不是使用private CustomAdapter mAdapter;(我建议avoid creating unnecessary objects)。

您可以使用DataSetObserver部分和ListAdapter.registerDataSetObserver(DataSetObserver observer)。 BaseAdapter实现将调用DataSetObserver.onChanged(),因此它适用于所有适配器。

BaseAdapter.notifyDataSetChanged():

public void notifyDataSetChanged() {
    mDataSetObservable.notifyChanged();
}

答案 1 :(得分:0)

您可以使用ArrayAdapter,它接受列表而不是数组。这样你可以使用notifyDataSetChanged()。

答案 2 :(得分:0)

你似乎认为我做错了。 如您所知,ListAdapter没有notifyDataSetChanged。

似乎Cursor与ListView最匹配。文档。说“通常数据来自Cursor,但这不是必需的.LiveView可以显示它包含在ListAdapter中的所有数据。”   如果你检查两个链接registerDataSetObserver ([DataSetObserver] 2观察者),你会发现一些事情。 ListAdapter适合光标。那么为什么不尝试使用其他适配器。

我认为刷新适配器的最佳方法是使用或扩展BaseAdapter(使用ListView)。并在更改数据集后使用notifyDataSetChanged。在我的情况下,它运行良好,轻柔(使列表视图和项目无效,滚动位置就在那里!不会到第一个位置)。