在网上看到很多,大多介绍都是利用Adapter的notifyDataSetChanged,通知Adapter数据已经更改,然后Adapter会调用getView()方法,重新显示界面。
但是除了这个之外,还有一个必须关注的就是,在调用Adapter的notifyDataSetChanged函数之前,需要手动修改Adapter具体数据成员,比如Cursor或List或Array,即变化了的部分都需要手动重赋值一遍,这样相应的Adapter的成员也必须是public的。 注:这里仅指ListView的Adapter是自定义的情况。
如:
1. Cursor 结合SQlite3数据库的情况:
// AgendaListAdapter.java
public class AgendaListAdapter extends BaseAdapter {
private static final String TAG = "AgendaListAdapter ======>";
public Context mContext;
public Cursor mCursor;
public AgendaListAdapter(Context context, Cursor cursor) {
mContext = context;
mCursor = cursor;
}
......
// DisplayAgendaListActivity.java
Cursor mCursor = mDatabaseAdapter.find(DatabaseAdapter.DATE, dateValue);
mListView = new ListView(this);
mAgendaListAdapter = new AgendaListAdapter(this, mCursor);
mListView.setAdapter(mAgendaListAdapter);
......
//数据库变化后,重查数据库,获得变化后mCursor, refresh
/** 更新mAgendaListAdapter的mCursor,以刷新mListView. */
Cursor mCursor = mDatabaseAdapter.find(DatabaseAdapter.DATE, dateValue);
mAgendaListAdapter.mCursor = mCursor;
mAgendaListAdapter.notifyDataSetChanged()
2. 其它:
public class HistoryListViewAdapter extends BaseAdapter {
public List<QueryRecord> mItemList;
//修饰符不能是private
private LayoutInflater mInflater;
private Context mContext;
public HistoryListViewAdapter(Context c,List<QueryRecord> itemList) {
mItemList = itemList;
mContext = c;
mInflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
//
}
......
// 再在数据重新获取后,重新设置数据
listitemAdapter.mItemList = list;
listitemAdapter.notifyDataSetChanged();
其它的,基本上同理,另外,如果存在多个Activity的切换,可以把刷新代码放在Activity的onStart()里面,这样每次当listview切换到最前时,呈现的都是最新的~!