我的书“Hello Android”将此作为一种使用自定义数据库助手,设置游标,然后按如下方式设置适配器的方式:
Cursor cursor
CustomDatabaseHelper test = new CustomDatabaseHelper(this);
try {
cursor = getData();
showData(cursor);
} finally {
test.close();
}
但是,每次我需要刷新数据集时,我都需要继续运行这段代码(由于“这个”不可用,因此在按钮的onClick()中会有点困难。
这是刷新数据集的最佳方法,还是应该删除.close并发出adapter.notifyDataSetChanged()?如果我这样做,有时我会收到一个强制关闭(我现在不记得了)但有时它无法正确删除 - 我想这可能是因为数据库当前处于打开状态并且它试图再次打开。
我们是否还要在Class中(在OnCreate之外)声明Cursors,DatabaseHelpers和Adapter的变量,以便所有函数都可以访问它们?
我意识到这只是在这个阶段很糟糕的编程,但我试图找到最好的做事方式。
答案 0 :(得分:93)
您应该使用adapter.notifyDataSetChanged()
。当你使用它时,日志会说什么?
答案 1 :(得分:16)
只需添加这些代码,然后再设置Adapter
它对我有用:
listView.destroyDrawingCache();
listView.setVisibility(ListView.INVISIBLE);
listView.setVisibility(ListView.VISIBLE);
或者直接在更改数据资源后可以使用以下方法。
adapter.notifyDataSetChanged()
答案 2 :(得分:12)
在Android上刷新适配器/ ListView的最佳方法
不仅调用notifyDataSetChanged()将刷新ListView数据,还必须先调用setAdapter()
才能正确加载信息:
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
答案 3 :(得分:10)
以下代码对我来说非常适合
EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter();
adp.UpdateDataList(EfficientAdapter.MY_DATA);
adp.notifyDataSetChanged();
QuickList.invalidateViews();
QuickList.scrollBy(0, 0);
答案 4 :(得分:1)
adapter.notifyDataSetChanged();
答案 5 :(得分:1)
如果没有任何效果,则只需使用新的结果集或更新的结果集再次创建适配器实例。然后您可以看到新视图。
XYZAdapter adbXzy = new XYZAdapter(context, 0, listData);
xyzListView.setAdapter(adbXzy);
adbXzy.notifyDataSetChanged();
答案 6 :(得分:0)
如果您正在使用LoaderManager,请尝试使用以下语句:
getLoaderManager().restartLoader(0, null, this);
答案 7 :(得分:0)
也许他们的问题是在数据库中进行搜索的时刻。在Fragment.java的Fragment Override周期中,我只想弄清楚:尝试用方法进行测试:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_x, container, false); //Your query and ListView code probably will be here
Log.i("FragmentX", "Step OnCreateView");// Try with it
return rootView;
}
尝试类似地将Log.i
..." onStart"和" onResume"。
最后在" onCreate"中剪切代码e把它放在" onStart"例如:
@Override
public void onStart(){
super.onStart();
Log.i("FragmentX","Step OnStart");
dbManager = new DBManager(getContext());
Cursor cursor = dbManager.getAllNames();
listView = (ListView)getView().findViewById(R.id.lvNames);
adapter = new CustomCursorAdapter(getContext(),cursor,0);// your adapter
adapter.notifyDataSetChanged();
listView.setAdapter(adapter);
}
答案 8 :(得分:0)
只需在自定义ArrayAdaper
中输入以下代码:
private List<Cart_items> customListviewList ;
refreshEvents(carts);
public void refreshEvents(List<Cart_items> events)
{
this.customListviewList.clear();
this.customListviewList.addAll(events);
notifyDataSetChanged();
}
答案 9 :(得分:-3)
只需在您的Custom ArrayAdaper中输入以下代码:
public void swapItems(ArrayList<Item> arrayList) {
this.clear();
this.addAll(arrayList);
}