`
king_tt
  • 浏览: 2113193 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【源码解读】setSelection 和 setSelectionFromTop

 
阅读更多

通常,app中的数据都是以ListView的形式展示的。默认地,把“新”数据添加到数据列表的尾部。

但是,如果是IM类型的app,比如查看历史消息这个模块。新数据并不是插到数据列表的尾部,而是插到数据列表的头部。

要实现比较好的用户体验,需要保持当前的ListView的位置。换句话说,如果我们能够随心所欲地指定ListView滚动的位置,那么这个问题就迎刃而解。

在ListView中,有一个setSelectionFromTop()方法,下面是一个使用范例。代码如下:

    @Override
    public void loaded(Long loadTime, int thisPageNumber, boolean isFromZero, boolean isHasMoreToLoad, List data) {
        refreshComplete();
        checkIfHasMoreToLoad(isHasMoreToLoad);

        if (thisPageNumber != 1) {// 不是第一页
            mListView.setSelectionFromTop(5+2, mIMPullToRefreshListView.getHeaderHeight());
            mIMPullToRefreshListView.getHeaderView().setVisibility(View.GONE);
        }
    }

看一下setSelectionFromTop()的具体实现,代码如下:

    /**
     * Sets the selected item and positions the selection y pixels from the top edge
     * of the ListView. (If in touch mode, the item will not be selected but it will
     * still be positioned appropriately.)
     *
     * @param position Index (starting at 0) of the data item to be selected.
     * @param y The distance from the top edge of the ListView (plus padding) that the
     *        item will be positioned.
     */
    public void setSelectionFromTop(int position, int y) {
        if (mAdapter == null) {
            return;
        }

        if (!isInTouchMode()) {
            position = lookForSelectablePosition(position, true);
            if (position >= 0) {
                setNextSelectedPositionInt(position);
            }
        } else {
            mResurrectToPosition = position;
        }

        if (position >= 0) {
            mLayoutMode = LAYOUT_SPECIFIC;
            mSpecificTop = mListPadding.top + y;

            if (mNeedSync) {
                mSyncPosition = position;
                mSyncRowId = mAdapter.getItemId(position);
            }

            requestLayout();
        }
    }
从上面的代码可以得知,setSelectionFromTop()的作用是设置ListView选中的位置,同时在Y轴设置一个偏移量(padding值)。

ListView还有一个方法叫setSelection(),传入一个index整型数值,就可以让ListView定位到指定Item的位置。

这两个方法有什么区别呢?看一下setSelection()的具体实现,代码如下:

    /**
     * Sets the currently selected item. If in touch mode, the item will not be selected
     * but it will still be positioned appropriately. If the specified selection position
     * is less than 0, then the item at position 0 will be selected.
     *
     * @param position Index (starting at 0) of the data item to be selected.
     */
    @Override
    public void setSelection(int position) {
        setSelectionFromTop(position, 0);
    }
原来,setSelection()内部就是调用了setSelectionFromTop(),只不过是Y轴的偏移量是0而已。

现在应该对setSelection()和setSelectionFromTop()有了更深刻的认识了。


参考资料

http://developer.android.com/reference/android/widget/ListView.html#setSelection%28int%29

http://www.cnblogs.com/over140/archive/2013/05/20/2948239.html

http://blog.csdn.net/jdsjlzx/article/details/17794209

http://blog.csdn.net/a859522265/article/details/8154103

分享到:
评论

相关推荐

    HorizontalListView实现setSelection修改

    HorizontalListView为网上广为流传的横向listview,但是里面的setSelection却未实现.代码关键在onLayout方法里面,这个方法里面有个mNextX,这个字段就是表示要滚动的位置,具体逻辑大家可以去仔细阅读一下

    HorizontalListView实现setSelection

    HorizontalListView为网上广为流传的横向listview,但是里面的setSelection却未实现.代码关键在onLayout方法里面,这个方法里面有个mNextX,这个字段就是表示要滚动的位置,具体逻辑大家可以去仔细阅读一下

    Android 仿360ui设计源码.zip

    这是android源码仿360恶意广告拦截扫描UI效果,布局主要是采用framelayout,然后主要用到的点就是gallery的setselection,图片是采用的360的截图,可以说是国内android ui设计的经典之作。   

    android天气查询源码

    listView.setSelection(0); titleText.setText("中国"); currentLevel = LEVEL_PROVINCE; } else { queryFromServer(null, "province"); } } /** * 查询选中省内所有的市,优先从数据库查询,...

    ListView默认Item选中状态

    这个类子讲了,在android中使用Listview的时候,如何把第一个Item设置为默认状态。

    Android代码-方便简洁的BottomDialog,支持任意布局

    BottomDialog 中文版 BottomDialog is a bottom dialog layout implemented with DialogFragment,And supports pop-up animation, support any layout Preview Import Maven me.shaohui ...compile 'me.shaohui:...

    viewflow实现类似淘宝,网易新闻的横幅banner,可循环自动播放

    我这里在viewflow源码的基础上加了点代码以实现这两个功能。 说viewflow没有实现循环这话不太对,其实要看你的adapter怎么写。因为viewflow是AdapterView。 要实现viewflow循环,你的adapter的getcount方法要返回...

    flash action script 经典字典教程大全,学flash必备

    flash action script 经典字典教程大全,学flash必备 -- --(递减) ++ ++(递增) ! !(逻辑 NOT) ......._highquality _highquality、Button._highquality、MovieClip._highquality、TextField._highquality ...

    vc基本算法

    基于vc方面的算法和设计类型数据m_m2.AddString("as"); //int &q,int &p; //m_ctrlSlider.GetSelection(int &q,int &p); m_ctrlSlider.SetSelection(10,20); // asd(); //m_m2.Default(); int SetLineSize(int nsize...

    IndicatorView轮播图的自定义点

    //设置点和点之间的间隙 mIndicator.setInterval(10); //设置点的图片 mIndicator.setIndicatorDrawable(UIUtils.getDrawable(R.drawable.indicator)); RelativeLayout.LayoutParams rl = new ...

    Android 仿360ui设计

    这是android源码仿360恶意广告拦截扫描UI效果,布局主要是采用framelayout,然后主要用到的点就是gallery的setselection,图片是采用的360的截图,可以说是国内android ui设计的经典之作。 

    LitePager:LitePager,一个轻量级的ViewPager,仿新版网易云歌单广场

    setSelection(View target) 选中指定子View setSelection(int index) 根据索引选中子View setOrientation(int orientation) 设置滑动方向(默认: ORIENTATION_HORIZONTAL):ORIENTATION_HORIZONTAL(水平)ORIENTATION_...

    Android TV listview及焦点处理

    Android TV listview及焦点处理 Android TV上的listview ,因为没有touch事件,只能通过按键处理,因此,用到listview时需要特殊处理: 1.复杂的view需要获取焦点,需要设置: setItemsCanFocus(true) ...

    listview点击无效的处理方法(推荐)

    下面小编就为大家带来一篇listview点击无效的处理方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    spinner2:Spinner2是默认Android的Spinner的重新实现,其中包含控件选择行为的简单方法

    微调2 Spinner2是对默认...后启用/禁用调用项单击操作spinner.setSelection(withAction, pos); 其中withAction是启用/禁用呼叫项单击操作的布尔标志 设置 步骤1.将JitPack存储库添加到您的构建文件中repositorie

    android ListView下拉分页

    setSelection(1); } } break; case MotionEvent.ACTION_DOWN: // 获得按下y轴位置 mLastMotionY = y; break; case MotionEvent.ACTION_MOVE: // 计算边距 applyHeaderPadding(event); break;

    QQ聊天机器人

    mChatView.setSelection(mDatas.size() - 1); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO...

    Android(2.2/2.3系统)Gallery解决默认和横竖屏切换选中状态问题

     Gallery的Item使用的是一个ImageView+TextView,并且为其设置了selector,当使用setSelection设置时、横竖屏切换时Item的状态不会改变,这个目前在2.2/2.3系统中存在,高版本如4.0是不存在的。 正文  一、第一步...

    Android之EditText控制禁止输入空格和回车

    这时会出现一个问题就是光标会自动跳转到第一个位置,在onTextChanged中会有一个叫做start的变量他会传入在这个空格输入之前的光标位置,EditText.setSelection(int)来改变光标的位置具体位置。 具体代码: private...

    HorizontalListView仿微信发起群聊

    gallery图片左右出现空白无法实现,在外国开源HorizontalListView这个组代码效果非常理想,现实这要继承adapterview,但是唯一缺点就是需要重写过setselection。。。。。 之前发帖这么久没有理我~! 最后自己解决了...

Global site tag (gtag.js) - Google Analytics