【移动开发】ListView的setSelection()和setSelectionFromTop()联系

  1. 【移动开发】ListViewsetSelection()和setSelectionFromTop()联系
  2. 通常,app中的数据都是以ListView的形式展示的。默认地,把“新”数据添加到数据列表的尾部。
  3. 但是,如果是IM类型的app,比如查看历史消息这个模块。新数据并不是插到数据列表的尾部,而是插到数据列表的头部。
  4. 要实现比较好的用户体验,需要保持当前的ListView的位置。换句话说,如果我们能够随心所欲地指定ListView滚动的位置,那么这个问题就迎刃而解。
  5. ListView中,有一个setSelectionFromTop()方法,下面是一个使用范例。代码如下
  6. java] view plain copy
    @Override
    publicvoid 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()的具体实现,代码如下:
    [java] view plain copy
    /**
    * 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.
    */
    publicvoid 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()的具体实现,代码如下:
    [java] view plain copy
    /**
    * 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
    publicvoid setSelection(int position){
    setSelectionFromTop(position,0);
    }
    原来,setSelection()内部就是调用了setSelectionFromTop(),只不过是Y轴的偏移量是0而已。
    现在应该对setSelection()和setSelectionFromTop()有了更深刻的认识了。
    

     

  7. 参考资料
  8. http://developer.android.com/reference/android/widget/ListView.html#setSelection%28int%29
  9. http://www.cnblogs.com/over140/archive/2013/05/20/2948239.html
  10. http://blog.csdn.net/jdsjlzx/article/details/17794209
  11. http://blog.csdn.net/a859522265/article/details/8154103
  12. 来源: http://blog.csdn.net/manoel/article/details/39183025
 



 



posted @ 2016-08-07 21:43  杨伟乔  阅读(385)  评论(0编辑  收藏  举报