详情页布局结构

需求是回显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.

但是为什么是负的我还是不清楚,望知道的网友告知。

 

 

---问题搞定,结贴!

 

 

 

 

 

 

 

posted on 2017-04-18 20:20  Ada_阿达  阅读(2213)  评论(1编辑  收藏  举报