ListView内容动态刷新

在网上看到很多,大多介绍都是利用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切换到最前时,呈现的都是最新的~!



posted on 2012-01-16 13:27  封起De日子  阅读(118)  评论(0编辑  收藏  举报

导航