在Android上刷新Adapter / ListView的最佳方式
我的书“Hello Android”给出了使用自定义数据库帮助程序,设置游标,然后设置适配器的方法,如下所示:
Cursor cursor CustomDatabaseHelper test = new CustomDatabaseHelper(this); try { cursor = getData(); showData(cursor); } finally { test.close(); }
但是,每次我需要刷新数据集时,我都需要继续运行这段代码(由于“this”不可用,所以在onClick()中为一个button有点困难。
这是刷新数据集的最佳方式,还是应该去除.close并发出adapter.notifyDataSetChanged()? 如果我这样做,有时候我会得到一个合力(现在我不记得了),但是有时它不能正确删除 – 我认为这可能是因为数据库当前打开,并且试图再次打开。
我们是否也应该在Class(OnCreate之外)声明Cursors,DatabaseHelpers和Adapter的variables,以便它们可以被所有的函数访问?
我意识到在这个阶段这只是一个糟糕的编程,但是我试图找出一些最好的办法。
你应该使用adapter.notifyDataSetChanged()
。 日志在使用时会说什么?
只需在设置Adapter
之前添加这些代码:
listView.destroyDrawingCache(); listView.setVisibility(ListView.INVISIBLE); listView.setVisibility(ListView.VISIBLE);
或者在改变数据资源之后直接使用下面的方法。
adapter.notifyDataSetChanged()
以下代码对我来说是完美的
EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter(); adp.UpdateDataList(EfficientAdapter.MY_DATA); adp.notifyDataSetChanged(); QuickList.invalidateViews(); QuickList.scrollBy(0, 0);
在Android上刷新Adapter / ListView的最佳方式
不仅调用notifyDataSetChanged()将刷新ListView数据,必须先调用setAdapter()
才能正确加载信息:
listView.setAdapter(adapter); adapter.notifyDataSetChanged();
如果您正在使用LoaderManager,请尝试以下语句:
getLoaderManager().restartLoader(0, null, this);
adapter.notifyDataSetChanged();
也许他们的问题是在数据库中进行search的时刻。 在他的Fragment.java的Fragment Override周期中,只需要:使用以下方法进行testing:
@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”中,把它放在“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); }
只需在您的Custom ArrayAdaper
写入以下代码:
private List<Cart_items> customListviewList ; refreshEvents(carts); public void refreshEvents(List<Cart_items> events) { this.customListviewList.clear(); this.customListviewList.addAll(events); notifyDataSetChanged(); }
只需在您的Custom ArrayAdaper中写入以下代码:
public void swapItems(ArrayList<Item> arrayList) { this.clear(); this.addAll(arrayList); }