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


72

我的书“ Hello Android”提供了一种使用自定义数据库帮助程序,设置游标,然后按如下所示设置适配器的方式:

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

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

这是刷新数据集的最佳方法,还是我应该着眼于删除.close并发出adapter.notifyDataSetChanged()?如果这样做,有时我会被迫关闭(目前我不记得了),但有时无法正确删除-我认为这可能是因为数据库当前处于打开状态,并且尝试再次打开。

我们是否还应该在Class中(在OnCreate之外)声明Cursors,DatabaseHelpers和Adapter的变量,以便所有功能都可以访问它们?

我意识到这在现阶段只是差劲的编程,但是我试图获得一些有关最佳做事方法的指导。


只是一个旁注:如果使用内容提供程序和LoaderManager,情况会有所不同。请参阅:stackoverflow.com/a/19657500/1087411
Anderson

Answers:



16

只需添加以下代码,然后Adapter对其进行设置即可:

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

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

   adapter.notifyDataSetChanged()

1
这确实也适用于Button://强制刷新myButton.setVisibility(Button.INVISIBLE); myButton.setVisibility(Button.VISIBLE);
hornetbzz 2012年

1
您必须出于什么目的刷新按钮?
sravan 2012年

在过滤器之后,然后应用其反向。
hornetbzz 2012年

13

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

不仅调用notifyDataSetChanged()会刷新ListView数据,还setAdapter()必须在正确加载信息之前调用它:

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

如果您使用setAdaper,则无需使用notifyDataSetChanged
Arda,

12

以下代码对我来说很完美

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

2
调用notifyDataSetChanged()对我来说还不够。invalidateViews()代替了。
卡·卡洛恩


2

如果没有任何效果,只需使用新的结果集或更新的结果集再次创建适配器实例。然后,您可以看到新视图。

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

adbXzy.notifyDataSetChanged();

0

如果您使用的是LoaderManager,请尝试使用以下语句:

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

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”中剪切代码,然后将其放入“ 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);
}

0

只需在“自定义”中编写ArrayAdaper以下代码:

private List<Cart_items> customListviewList ;

refreshEvents(carts);

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

-4

只需在您的Custom ArrayAdaper中编写以下代码:

public void swapItems(ArrayList<Item> arrayList) {
    this.clear();
    this.addAll(arrayList);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.