通常,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();
- }
- }
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()有了更深刻的认识了。
参考资料
http://developer.android.com/reference/android/widget/ListView.html#setSelection%28int%29
http://www.cnblogs.com/over140/archive/2013/05/20/2948239.html