zoukankan      html  css  js  c++  java
  • listview滑动

    单击其中的一个item时,让这个item能滚动的listview的顶部。现在用 list.scrollTo(0, item.getTop()); 实现啦

    android listview滚动到顶部

    转http://www.cnblogs.com/july2012/p/4081929.html

    1.为了实现类似IOS点击状态栏,列表回滚到顶部的功能(要平滑滚动效果),android上点击一个按钮或是图片什么的也可以让listview一次性滚动到顶部(滑动太多页时,一次可能滚不到顶部,使用handler定时监听,继续滚动,直至回到顶部)

    public static void scrollToListviewTop(final AbsListView listView)

        {

            listView.smoothScrollToPosition(0);

            final Handler handler = new Handler();

            handler.postDelayed(new Runnable()

            {

                @Override

                public void run()

                {

                    if (listView.getFirstVisiblePosition() > 0)

                    {

                        listView.smoothScrollToPosition(0);

                        handler.postDelayed(this, 100);

                    }

                }

            }, 100);

        }

    此方法的优点是:适用于任何的listview(item单一样式的,多种样式的都可以),而且不存在界面显示问题

    缺点是:滑动数据量很大时,回滚时间会比较长。改进办法是将handler里的这两行代码:

    listView.smoothScrollToPosition(0);

    handler.postDelayed(this, 100);

    换成:

    listView.setSelection(0);再根据需要修改间隔时间(100毫秒),就完美啦~~~

    2.对于单一样式且数据较少的listview,滑动停止时可以计算出滚动的高度,回滚时使用listView.smoothScrollBy(getScrollY(), 500);

    listview滚动高度原理是假设每个item的高度是一定的(多数情况下的确如此),那么只要知道当前在第几个item,就可以计算出总的高度,因为第一个可见item的一部分可能已经移出了边界,所以再通过mListView.getChildAt(0)获得第一个子view,使用getTop()方法计算出这个偏差(得到的一般是负数)。因为是回滚,所以最后滚动距离要是负数,另外可能会有一定的误差,适当的加上个负数,综合起来就可以计算出当前ListView的滚动高度。这种滚动效果比较自然,快到顶部时滚动速度越来越慢,最后停止。

    public int getScrollY()

        {

            View c = listView.getChildAt(0);

            if (c == null)

            {

                return 0;

            }

            int firstVisiblePosition = listView.getFirstVisiblePosition();

            int top = c.getTop();

            

            if (firstVisiblePosition == 0)

            {

                return top;

            }

            else

            {

                return top - (firstVisiblePosition - 1) * c.getHeight() - 17;

            }

        }

    3.如果只要求回到顶部,不需要滚动效果的话,很简单,只需要调用listview.setSelection(0)就ok了。

     

    ………………………………………………………………华丽的分割线………………………………………………………………………………

    ps:顺便记一下修改listview快速滚动滑块的方法:

     

            try

            {

                Field f = AbsListView.class.getDeclaredField("mFastScroller");

                f.setAccessible(true);

                Object o = f.get(listView);

                f = f.getType().getDeclaredField("mThumbDrawable");

                f.setAccessible(true);

                Drawable drawable = (Drawable) f.get(o);

                drawable=context.getResources().getDrawable(R.drawable.transparent);

                f.set(o, drawable);

            }

            catch (Exception e)

            {

                LogUtils.error(e + "");

            }

       

  • 相关阅读:
    POJ 3635 Full Tank?
    ZOJ 2112 Dynamic Rankings
    POJ 3468 A Simple Problem with Integers (2)
    FJOI2007 轮状病毒
    HDU 3308 LCIS
    POJ 2449 Remmarguts' Date
    Adroid平台图表案例源码
    Android项目——实现时间线程源码
    关于Ubuntu上Eclipse不显示手机设备
    自定义ListView下拉弹起效果
  • 原文地址:https://www.cnblogs.com/yaya-Android/p/4528289.html
Copyright © 2011-2022 走看看