在网上看到很多,大多介绍都是利用Adapter的notifyDataSetChanged,通知Adapter数据已经更改,然后Adapter会调用getView()方法,重新显示界面。
但是除了这个之外,还有一个必须关注的就是,在调用Adapter的notifyDataSetChanged函数之前,需要手动修改Adapter具体数据成员,比如Cursor或List或Array,即变化了的部分都需要手动重赋值一遍,这样相应的Adapter的成员也必须是public的。 注:这里仅指ListView的Adapter是自定义的情况。
如:
1. Cursor 结合SQlite3数据库的情况:
// AgendaListAdapter.javapublic 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.javaCursor 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切换到最前时,呈现的都是最新的~!