2015-10-28

来源:互联网 发布:ubuntu编译用什么版本 编辑:程序博客网 时间:2024/06/05 02:55

在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,还会清空数据以及内部设置的“观察者”之类的,

0 0
原创粉丝点击