您的位置:首页 > 其它

listview 精确定位

2015-09-09 07:33 316 查看
工作中遇到一个需求,对ListView某一项操作后刷新ListView,但是如果直接刷新,界面上ListView从第一列开始显示,用户体验不好,于是在网上搜了一些恢复LIstView滑动位置的方法。解决办法如下:

List<HashMap<String, String>> list;

private int scrollPos;

private int scrollTop;

private void showLocalMp3() {

list = new ArrayList<HashMap<String,String>>();

LocalMP3Infor mp3Infor = null;

HashMap<String, String> tempMap = null;

for(int i=0; i<mp3InforList.size(); i++) {

mp3Infor = (LocalMP3Infor)mp3InforList.get(i);

tempMap = new HashMap<String, String>();

tempMap.put("mp3_name", mp3Infor.getMp3_name());

tempMap.put("mp3_size", mp3Infor.getMp3_size());

list.add(tempMap);

}

SimpleAdapter simpleAdapter =

new SimpleAdapter(this, list, R.layout.mp3list_resource, new String[] {"mp3_name", "mp3_size"}, new int[] {R.id.name, R.id.size});

//给ListView设置监听器 【用来恢复ListView位置的】

listView.setOnScrollListener(scrollListener);

setListAdapter(simpleAdapter);

//在setListAdapter之后恢复ListView的位置

listView.setSelectionFromTop(scrollPos, scrollTop);

}

private OnScrollListener scrollListener = new OnScrollListener() {

@Override

public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {

}

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {

// scrollPos记录当前可见的List顶端的一行的位置

scrollPos = listView.getFirstVisiblePosition();

}

if (list != null) {

View v=listView .getChildAt(0);

scrollTop=(v==null)?0:v.getTop();

}

}

};

参考:http://stackoverflow.com/questions/3014089/scroll-to-a-position-in-a-listview

之前在网上搜到的,有另外两种方法

第一种:

在onScrollStateChanged里面

scrolledX = listView.getScrollX();

scrolledY = listView.getScrollY();

恢复时使用listView.scrollTo(scrolledX, scrolledY);

但是得到的scrolledY为0

第二种:

在onScrollStateChanged里面

position = listView.getFirstVisiblePosition();

用position记录显示在屏幕顶端的一个item,

恢复时使用listView.setSelection(position);

但是这种方法不够精确

===============================================================================================


Android ListView中如何进行精确的定位

标签: android getdividerheight
转自: /article/2421284.html

大概的代码如下:

view
plain

private final LinkedList<Integer> mPositionsList = new LinkedList<Integer>();

private final LinkedList<Integer> mHeightsList = new LinkedList<Integer>();

......

......

在 onItemClick(AdapterView<?> parent, View view, int position, long id) 中记录点击的位置,以及相对第一行的位置,

int iFirstPosition = mListView.getFirstVisiblePosition() == 0 ? -1 : mListView

.getFirstVisiblePosition();

int mToTopHeight = (position - iFirstPosition)

* (view.getHeight() + mListView.getDividerHeight())

- mListView.getDividerHeight();

mPositionsList.add(position);

mHeightsList.add(mToTopHeight);

......

......

在需要恢复的位置上添加以下代码:

mListView.setSelectionFromTop(mPositionsList.getLast(), mHeightsList.getLast());

mPositionsList.removeLast();

mHeightsList.removeLast();

当前位置相对于第一个可显示的位置的高度是:

(当前位置 - 第一个显示在Listview中的位置) * (item 项高 + 分隔符高) - 一个分隔符的高度

在恢复位置时调用:

view
plain

mListView.setSelectionFromTop(mPositionsList.getLast(), mHeightsList.getLast());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: