微信IM聊天信息下拉加载数据

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

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

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

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

[java]  view plain  copy
  1. @Override  
  2. public void loaded(Long loadTime, int thisPageNumber, boolean isFromZero, boolean isHasMoreToLoad, List data) {  
  3.     refreshComplete();  
  4.     checkIfHasMoreToLoad(isHasMoreToLoad);  
  5.   
  6.     if (thisPageNumber != 1) {// 不是第一页  
  7.         mListView.setSelectionFromTop(5+2, mIMPullToRefreshListView.getHeaderHeight());  
  8.         mIMPullToRefreshListView.getHeaderView().setVisibility(View.GONE);  
  9.     }  
  10. }  

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

[java]  view plain  copy
  1. /** 
  2.  * Sets the selected item and positions the selection y pixels from the top edge 
  3.  * of the ListView. (If in touch mode, the item will not be selected but it will 
  4.  * still be positioned appropriately.) 
  5.  * 
  6.  * @param position Index (starting at 0) of the data item to be selected. 
  7.  * @param y The distance from the top edge of the ListView (plus padding) that the 
  8.  *        item will be positioned. 
  9.  */  
  10. public void setSelectionFromTop(int position, int y) {  
  11.     if (mAdapter == null) {  
  12.         return;  
  13.     }  
  14.   
  15.     if (!isInTouchMode()) {  
  16.         position = lookForSelectablePosition(position, true);  
  17.         if (position >= 0) {  
  18.             setNextSelectedPositionInt(position);  
  19.         }  
  20.     } else {  
  21.         mResurrectToPosition = position;  
  22.     }  
  23.   
  24.     if (position >= 0) {  
  25.         mLayoutMode = LAYOUT_SPECIFIC;  
  26.         mSpecificTop = mListPadding.top + y;  
  27.   
  28.         if (mNeedSync) {  
  29.             mSyncPosition = position;  
  30.             mSyncRowId = mAdapter.getItemId(position);  
  31.         }  
  32.   
  33.         requestLayout();  
  34.     }  
  35. }  
从上面的代码可以得知,setSelectionFromTop()的作用是设置ListView选中的位置,同时在Y轴设置一个偏移量(padding值)。

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

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值