您的位置:首页 > 其它

2015-10-28

2015-10-28 21:22 281 查看

在Adapter 数据的更新

一般来说用notifyDataSetChanged()方法通知适配器数据发生变化,更新view,后来发现另一个真正的 “更新”方法:

public void setAdapter(ListAdapter adapter) {
//清空之前绑定的mDataSetObserver对象
if (mAdapter != null && mDataSetObserver != null) {
mAdapter.unregisterDataSetObserver(mDataSetObserver);
}

//清空之前的一切数据,初始化一些必要的参数
resetList();
mRecycler.clear();
//重置adapter
mAdapter = adapter;

//初始化上次选中item的位置
mOldSelectedPosition = INVALID_POSITION;
//初始化上次选中行的位置,即:当初选中的行的索引
mOldSelectedRowId = INVALID_ROW_ID;

// AbsListView#setAdapter will update choice mode states.
super.setAdapter(adapter);

if (mAdapter != null) {
//记录之前girdView里面item的数目
mOldItemCount = mItemCount;
//当前girdView里面item的数据
mItemCount = mAdapter.getCount();
//数据已经变化
mDataChanged = true;

//检测焦点
checkFocus();

//注册观察者
mDataSetObserver = new AdapterDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);

mRecycler.setViewTypeCount(mAdapter.getViewTypeCount());

int position;
//判断是否从最后来查找Selectable的的位置
//lookForSelectablePosition从方法实现上来看是第二个参数是没有用到的
if (mStackFromBottom) {

position = lookForSelectablePosition(mItemCount - 1, false);
} else {
position = lookForSelectablePosition(0, true);
}
//选中第几个,记录了行和当前girdview的id
setSelectedPositionInt(position);
//选中下一个
setNextSelectedPositionInt(position);
//检测是否选中的位置改变
checkSelectionChanged();
} else {
checkFocus();
// Nothing selected
checkSelectionChanged();
}
//充值布局
requestLayout();
}


如上所示就是setAdapter()方法,此方法不仅会清空以创建的itemView,还会清空数据以及内部设置的“观察者”之类的,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Adapter