在 Android 上刷新 Adapter/ListView 的最佳方法

我的书《 Hello Android 》提供了一种使用自定义 db 助手、设置游标、然后设置适配器的方法,如下所示:

Cursor cursor
CustomDatabaseHelper test = new CustomDatabaseHelper(this);
try {
cursor = getData();
showData(cursor);
} finally {
test.close();
}

但是,每次我需要刷新数据集时,我都需要继续运行这段代码(由于“ this”不可用,在一个按钮的 onClick ()中运行这段代码会有点困难。

这是刷新数据集的最佳方式吗,还是应该考虑删除。关闭并发出 Adapter.notifyDataSetChanged () ?如果我这样做,有时我得到一个力关闭(我不记得此刻) ,但有时它不能正确删除-我认为这可能是因为数据库是当前打开,它试图再次打开。

我们是否还应该在类(OnCreate 之外)中声明 Cursor、 DatabaseHelpers 和 Adapter 的变量,以便所有函数都可以访问它们?

我意识到这只是在这个阶段糟糕的编程,但我试图得到一些关于做事情的最佳方式的指导。

168705 次浏览

您应该使用 adapter.notifyDataSetChanged()。当您使用它时,日志会显示什么?

下面的代码非常适合我

EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter();
adp.UpdateDataList(EfficientAdapter.MY_DATA);
adp.notifyDataSetChanged();
QuickList.invalidateViews();
QuickList.scrollBy(0, 0);

简单地添加这些代码之前,设置 Adapter它的工作为我:

    listView.destroyDrawingCache();
listView.setVisibility(ListView.INVISIBLE);
listView.setVisibility(ListView.VISIBLE);

或者可以在更改数据资源后直接使用以下方法。

   adapter.notifyDataSetChanged()

如果您正在使用 LoaderManager,请尝试使用以下语句:

getLoaderManager().restartLoader(0, null, this);

只要在你的自定义数组里写下这段代码:

public void swapItems(ArrayList<Item> arrayList) {
this.clear();
this.addAll(arrayList);
}
adapter.notifyDataSetChanged();

也许他们的问题是在数据库中进行搜索的时刻。在他的 Fragment.java 片段覆盖周期中,只需要: 尝试使用这些方法进行测试:

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

只需在你的自定义 ArrayAdaper中写下以下代码:

private List<Cart_items> customListviewList ;


refreshEvents(carts);


public void refreshEvents(List<Cart_items> events)
{
this.customListviewList.clear();
this.customListviewList.addAll(events);
notifyDataSetChanged();
}

在 Android 上刷新 Adapter/ListView 的最佳方法

调用 NotifyDataSetChanged ()不仅会刷新 ListView 数据,而且必须先调用 setAdapter()才能正确加载信息:

  listView.setAdapter(adapter);
adapter.notifyDataSetChanged();

如果没有工作,只需再次创建带有新结果集或更新的结果集的适配器实例。然后你可以看到新的视图。

XYZAdapter adbXzy = new XYZAdapter(context, 0, listData);
xyzListView.setAdapter(adbXzy);


adbXzy.notifyDataSetChanged();