在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); }