Android ListView – 停止在“整体”行位置滚动

Android ListView – 停止在“整体”行位置滚动,第1张

概述对不起,令人困惑的标题,我不能很简洁地表达这个问题… 我有一个带有ListView的Android应用程序,它使用一个循环/“无限”适配器,这基本上意味着我可以按照我想要的方式向上或向下滚动,当它到达顶部或底部时,项目将会包围给用户好像他正在旋转(〜100)个重复项目的无限长列表. 此设置的要点是让用户选择一个随机项目,只需旋转/退出列表视图并等待看到它停止位置.我减少了Listview的摩擦, 对不起,令人困惑的标题,我不能很简洁地表达这个问题…

我有一个带有ListVIEw的Android应用程序,它使用一个循环/“无限”适配器,这基本上意味着我可以按照我想要的方式向上或向下滚动,当它到达顶部或底部时,项目将会包围给用户好像他正在旋转(〜100)个重复项目的无限长列表.

此设置的要点是让用户选择一个随机项目,只需旋转/退出列表视图并等待看到它停止的位置.我减少了ListvIEw的摩擦,所以它的速度更快更长,这似乎工作非常好.最后,我在ListVIEw的顶部放置了部分透明的图像,以阻止顶部和底部的项目(从透明到黑色的过渡),使其看起来好像用户正在“选择”中间的项目,就好像正在旋转的“轮子”,他们通过逃跑控制.

有一个明显的问题:抛出后,ListVIEw不会停止在特定的项目,但它可以停止在两个项目之间的悬停(其中第一个可见项目仅被部分显示).我想避免这种情况,因为在这种情况下,哪个项目被“随机选择”是不明显的.

长篇小说:在ListVIEw完成滚动后,我希望它在“整体”行停止,而不是部分可见的行.

现在我通过检查滚动停止的时间,然后选择第一个可见的项目来实现这个行为,如下所示:

lv = this.getListVIEw();    lv.setFriction(0.005f);    lv.setonScrollListener(new OnScrollListener() {        public voID onScroll(AbsListVIEw vIEw,int firstVisibleItem,int visibleItemCount,int totalitemCount) {}        public voID onScrollStateChanged(AbsListVIEw vIEw,int scrollState) {            if (scrollState == OnScrollListener.SCRolL_STATE_IDLE)             {                if (isautoScrolling) return;                isautoScrolling = true;                int pos = lv.getFirstVisibleposition();                lv.setSelection(pos);                isautoScrolling = false;            }        }    });

除了一个明显明显的问题之外,这个工作相当不错.第一个可见的项目可能只有一个或两个像素可见.在这种情况下,我希望ListVIEw向上移动这两个像素,以便选择第二个可见项目.相反,当然,选择第一个可见项目,这意味着ListVIEw几乎可以“下降”几乎整个行(减去两个像素).

简而言之,我不想跳到第一个可见的项目,而是跳到最可见的项目.如果第一个可见项目少于一半可见,我希望它跳到第二个可见项目.

这是一个希望表达我的观点的例证.最左边的ListVIEw(每对)都显示了在停止后停止的状态(正在停止),右侧的ListVIEw会通过选择第一个可见项来显示它的“跳转”状态.在左边我显示当前(错误)的情况:项目B只是几乎看不到,但它仍然是第一个可见的项目,所以ListVIEw跳转选择该项目 – 这是不合逻辑的,因为它必须滚动几乎整个项目的高度到那里.滚动到项目C(右侧所示)更合乎逻辑,因为这是“更近”的.

Image http://nickthissen.nl/Images/lv.jpg

如何达到这个目的?我想到的唯一方法是以某种方式衡量第一个可见项目的可见范围.如果超过50%,那我跳到那个位置.如果不到50%,我跳到那个位置1.然而,我不知道如何衡量那个…

有任何想法吗?

解决方法 您可以使用getChildVisibleRect方法获取小孩的可见维度.当你有这个,并且你得到孩子的总高度,你可以滚动到适当的孩子.

在下面的示例中,我检查是否至少有一半的孩子是可见的:

VIEw child = lv.getChildAt (0);    // first visible childRect r = new Rect (0,child.getWIDth(),child.getHeight());     // set this initially,as required by the docsdouble height = child.getHeight () * 1.0;lv.getChildVisibleRect (child,r,null);if (Math.abs (r.height ()) < height / 2.0) {    // show next child}else {    // show this child}
总结

以上是内存溢出为你收集整理的Android ListView – 停止在“整体”行位置滚动全部内容,希望文章能够帮你解决Android ListView – 停止在“整体”行位置滚动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1134217.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存