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

时间:2010-11-16 12:31:51

标签: android listview refresh

我的书“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的变量,以便所有函数都可以访问它们?

我意识到这只是在这个阶段很糟糕的编程,但我试图找到最好的做事方式。

10 个答案:

答案 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);
}