我确实使用此代码在更改后用数据重新填充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();
}
答案 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。在我的情况下,它运行良好,轻柔(使列表视图和项目无效,滚动位置就在那里!不会到第一个位置)。