美文网首页
ListView获取垂直滚动距离

ListView获取垂直滚动距离

作者: blueizz | 来源:发表于2017-03-17 12:00 被阅读0次

在开发过程中,可能需要获取ListView的垂直滚动距离,通过滚动距离,来做一些UI上的变化。在ListView的OnScrollListener监听器中,只提供了第一个可见Item的位置(firstVisibleItem)、可见Item的总数(visibleItemCount)以及Item的总数(totalItemCount),并没有提供直接获取垂直滚动距离的方法,这时需要自己通过这些参数来计算ListView垂直滚动距离。

说一下具体实现的思路:
(1)监听ListView的滚动事件,在onScroll方法中,首先将当前第一个可见Item的高度和top存入到SparseArray中。

(2)然后在获取垂直滚动距离时,从SparseArray中取出所有被滑动隐藏的Item的高度相加,即得到了被滑动隐藏掉的Item的高度总和。

(3)最后用高度总和加上当前第一个可见Item的top值,该top值就是当前第一个可见Item被滑动隐藏掉的高度,这样就得到了ListView垂直滚动的距离。具体实现代码如下所示:

mListView.setOnScrollListener(new OnScrollListener() {
    // 创建一个稀疏数组,用于存储Item的高度和mTop
    private SparseArray recordSp = new SparseArray(0);
    private int mCurrentFirstVisibleItem = 0;

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

    }

    @Override
   public void onScroll(AbsListView view, int firstVisibleItem, 
                         int visibleItemCount, int totalItemCount) {
        mCurrentFirstVisibleItem = firstVisibleItem;
        // 这里获取的Item是ListView中第一个可见的Item
        View firstView = view.getChildAt(0);
        if (null != firstView) {
            ItemRecord itemRecord = 
                    (ItemRecord) recordSp.get(firstVisibleItem);
            if (null == itemRecord) {
                itemRecord = new ItemRecord();
            }
            itemRecord.height = firstView.getHeight();
            // top值总是小于或等于0的
            itemRecord.top = firstView.getTop();
            /**
            * 将当前第一个可见Item的高度和top存入SparseArray中,
            * SparseArray的key是Item的position
            */
            recordSp.append(firstVisibleItem, itemRecord);
            int scrollY = getScrollY();
            Log.i(TAG, "垂直滚动距离:" + scrollY);
        }

    }

    private int getScrollY() {
        int height = 0;
        for (int i = 0; i < mCurrentFirstVisibleItem; i++) {
            /**
             * 取出所有已滑过的Item的高度,相加。
             * 说明下这里为什么不直接用一个Item高度乘以所有已滑过的Item的数量,
             * 主要是考虑到可能为ListView添加Header这种情况,如果Header的高度
             * 与Item的高度是相同的可以这样做,如果Header的高度不等于Item的高度,
             * 这时将Header的高度直接按照Item的高度来计算就不准确了。
             */
            ItemRecord itemRecord = (ItemRecord) recordSp.get(i);
            height += itemRecord.height;
        }
        //取出当前第一个可见Item的ItemRecord对象
        ItemRecord itemRecord = 
                (ItemRecord) recordSp.get(mCurrentFirstVisibleItem);
        if (null == itemRecord) {
            itemRecord = new ItemRecord();
        }
        //由于存入的top值是小于或等于0的,这里是减去top值而不是加
        return height - itemRecord.top;
    }

    class ItemRecord {
        int height = 0;
        int top = 0;
    }
});

相关文章

  • ListView获取垂直滚动距离

    在开发过程中,可能需要获取ListView的垂直滚动距离,通过滚动距离,来做一些UI上的变化。在ListView的...

  • 7.1-Flutter中列表组件ListView

    基于ListView实现水平和垂直方向滚动列表 实现垂直滚动列表 也可以使用ListView.Builder更加高...

  • flutter listview(07)

    固定的垂直布局 横向滑动的listview 简单demo无限滚动的listview

  • ScrollView嵌套ListView手势冲突

    外层ScrollView,内嵌ListView,都是垂直方向。采用内部拦截法,实现ListView能滚动时则让Li...

  • scrollTop, offsetTop, pageYOffse

    scrollTop DOM对象的scrollTop用于获取或者设置一个元素里滚动的距离(垂直)。例如:docume...

  • listview获取Y轴的滚动距离

    最近项目中有个需求,就是根据listview滚动的Y值坐标,要做一个简单的动画效果,可是发现listview.ge...

  • Flutter组件(二):ListView

    ListView是最常用的滚动控件。默认滚动方向是垂直方向滚动 创建滚动控件有3种方法: 1.直接创建,是已知子控...

  • 基础篇_使用ListView

    ListView 组件 用于显示一个垂直的滚动列表,其中的元素之间结构近似而仅数据不同。ListView 更适于长...

  • 如何使用ListView

    ListView组件用于显示一个垂直的滚动列表,其中的元素之间结构近似而仅数据不同。 ListView更适于长列表...

  • 9,React Native之ListView

    1,ListView组件用于显示一个垂直的滚动列表,其中的元素之间结构近似而仅数据不同。2,ListView更适于...

网友评论

      本文标题:ListView获取垂直滚动距离

      本文链接:https://www.haomeiwen.com/subject/pecenttx.html