詳情頁布局結構
需求是回顯webview展示網頁的閱讀位置
方案1:
使用webview.getScrollY()獲取滑動到的位置,用setScrollY()回顯設置,
但是兩個方法都出現了問題,getScrollY()時獲取得到的值始終是0,由於使用的是騰訊
的x5內核,參考x5論壇的方法使用getWebScrollY(),但獲取到的值一樣是0,沒有找到解決方法。
使用ScrollTo()的時候,webView在整個listView中的位置向上移動了,而且不能再滑上去了。
這個方案只能放棄。
方案2:
使用listView.ScrollTo(x,y)精確定位回顯
本來以為這個方法可行,結果listView.getScrollY()獲取到的值依然是0,無法記錄滑動到的位置。
ScrollTo()方法倒是可用,但也遇到了新的問題--手指觸發滑動事件時會時listView又跑到最頂部去了!
。感覺這個方案應該是可行的,就看后續怎么解決了。
---未完待續
2017/04/20
經過兩天的不懈努力,就在我快要放棄跟產品說這個功能實現不了的時候,找到了最終的解決方案。
兩步實現:
1.保存listview滾動的位置,在自定義view中實現
private int m_nItemCount; private int[] m_nItemOffY; public int getListItemsHeight() { ListAdapter adapter = getAdapter(); m_nItemCount = adapter.getCount(); int height = 0; int i; m_nItemOffY = new int[m_nItemCount]; for (i = 0; i < m_nItemCount; ++i) { View view = adapter.getView(i, null, this); view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); m_nItemOffY[i] = height; height += view.getMeasuredHeight(); } return height; } public int getListScrollY() { int pos, nScrollY, nItemY; View view; pos = getFirstVisiblePosition(); view = getChildAt(0); nItemY = view.getTop(); nScrollY = m_nItemOffY[pos] - nItemY; return nScrollY; }
2.再次進入時滾動到上次保存的位置,主要是使用setSelectionFromTop()這個方法,依然是在自定義view中添加,在activity中調用
public void scrollBy(int px){ setSelectionFromTop(getFirstVisiblePosition() , getChildAt(0).getTop() - px); }
關鍵是第二個參數,雖然保存的是滑動到的距離的pixel值,但是經測試,這里的第二個值應該是保存的值的負數
看下源碼中對第二個參數的解釋:
@param y The distance from the top edge of the ListView (plus padding) that the
* item will be positioned.
但是為什么是負的我還是不清楚,望知道的網友告知。
---問題搞定,結貼!