zoukankan      html  css  js  c++  java
  • ListView中的setOnScrollListener

    ListView是Android中最常用的控件之一,随着时代发展,RecyclerView有取代它的趋势,但是在一些老代码中,ListView依然扮演着重要的作用。
    项目中遇到一个需求,需要监听ListView在滑动时滑动的Y轴坐标。这个需求在RecyclerView中computeVerticalScrollOffset方法完成了这项功能。只需要在OnScrollListener的onScrolled方法中,调用computeVerticalScrollOffset即可在滑动时获得Y坐标。
    然而,在ListView中,这个实现却没有这么方便。
    在ListView中,setOnScrollListener(new AbsListView.OnScrollListener(),可以获得以下两个方法:
    1)public void onScrollStateChanged(AbsListView view, int scrollState)
    2)public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)

    方法1 监听着ListView的滑动状态改变。官方的有三种状态SCROLL_STATE_TOUCH_SCROLL、SCROLL_STATE_FLING、SCROLL_STATE_IDLE:

    SCROLL_STATE_TOUCH_SCROLL:手指正拖着ListView滑动

    SCROLL_STATE_FLING:ListView正自由滑动

    SCROLL_STATE_IDLE:ListView滑动后静止

    方法2 监听滑动:

    firstVisibleItem:第一个可见项是ListView的第几项

    visibleItemCount:可见项的总数

    totalItemCount:总项数

    可见,在ListView中,我们是没有获得滑动Y坐标的方法的。但是我们有firstVisibleItem,由它可以知道我们已经滑走了多少个item,然后逐一测出它们的高度就可以得知总共滑走的Y值是多少了。

      Dictionary<Integer, Integer> listViewItemHeights = new Hashtable<Integer, Integer>();       
       contentListView.setOnScrollListener(new AbsListView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
    
                }
    
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    
    
                    View c = view.getChildAt(0); //this is the first visible row
                    if (c != null) {
                        int scrollY = -c.getTop();
                        listViewItemHeights.put(view.getFirstVisiblePosition(), c.getHeight());
                        for (int i = 0; i < view.getFirstVisiblePosition(); ++i) {
                            if (listViewItemHeights.get(i) != null) // (this is a sanity check)
                                scrollY += listViewItemHeights.get(i); //add all heights of the views that are gone
    
                        }
                        Log.d("tag", "the scrollY of the listview is==========" + scrollY);
                    }
    
                }
            });

      其中scrollY就是滑动的Y值。

  • 相关阅读:
    MPI linux Ubuntu cluster 集群
    python cython c 性能对比
    TCAM CAM 说明 原理 结构 Verilog 硬件实现
    verilog 计算机网络 仿真 激励 pcap
    libtrace 安装 使用 修改
    Dream Spark ------spark on yarn ,yarn的配置
    Dream_Spark-----Spark 定制版:005~贯通Spark Streaming流计算框架的运行源码
    Dream_Spark-----Spark 定制版:003~Spark Streaming(三)
    Dream_Spark-----Spark 定制版:004~Spark Streaming事务处理彻底掌握
    Dream_Spark定制第二课
  • 原文地址:https://www.cnblogs.com/fishbone-lsy/p/4647046.html
Copyright © 2011-2022 走看看