安卓 smoothScrollBy 行为异常

49
我有一个ListView,我在上面调用smoothScrollBy()。95%的情况下,smoothScrollTo()表现正常。 然而,有时它并没有停留在预期位置!我已经确认我给它的是相同的值。当发生错误时,我注意到平滑滚动不太平滑,但我的应用程序没有控制其他任务。
我不确定后台正在发生什么,但一个可能的罪魁祸首是垃圾回收。
在这种情况下,95%的准确率是不够好的。 我将不得不实现某种纠正机制,以确保在这些情况下ListView落在正确的位置。
除了简单地调用view.smoothScrollBy(distance, time);,是否有更好的使用smoothScrollBy()的方法?

2
是的,最终我放弃了ListView,改用ScrollView来更好地控制位置,并向其中添加子视图。在我找到这个方法之前,我使用了一种校正机制,以确保它滚动到正确的位置,如果不行,则再次滚动。这非常不精确,对于专业应用程序来说是不可接受的 :( - Tyler
5
非常感谢你,Styler。今天我尝试实现了一个校正机制,基本上是通过迭代方式应用多次滚动,连续的滚动通过HandlerOnScrollListener()调用。我很惊讶地说,最终结果非常好。我所做的是让大部分滚动非常快,但最后500px的最后一次滚动是缓慢的(400ms)。这使得整个滚动看起来非常流畅和漂亮,就像单个非线性滚动一样。我需要找些时间来组装一个示例并在这里发布。 - Trevor
1
那将是一个很好的替代答案.. 做得好 :) - Tyler
1
使用此函数http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)来发布操作。不要只在主线程上运行它。 - Sherif elKhatib
@Trevor 你能发一下你最终做了什么吗? - Prateek
显示剩余3条评论
2个回答

7

有时会出现时间问题。当视图被添加到您的列表视图中时,如果时间不对,就会发生这种情况。

view.smoothScrollBy(distance, time);

列表视图或用户界面无需刷新。因此,请在视图的后台线程中使用特定延迟执行此操作。例如:

view.postDelayed(new Runnable{
    view.smoothScrollBy(distance, time);
},1000);

我认为这不够流畅,这意味着您必须等待1秒钟才能启动滚动。对于我正在使用的应用程序来说,这将是一个停止程序的问题。 - Tyler
1
那个1秒的延迟只是一个示例...请检查刷新视图所需的时间,然后添加相应的延迟。它不一定是一秒钟,甚至可以是毫秒级别的。 - Arun
5
这取决于手机型号,总的来说,这个答案有些粗糙,在生产环境中不能使用。 - Tyler

6

试试以下方法:

Listview有自己的滚动机制。当内容被添加时,它会滚动。

  1. 将listview的高度(android:layout_height)分配为match_parent或fill_parent。

  2. 如果您在工作线程中分配适配器,请不要在该线程中执行任何UI操作。

如果以上方法无法解决问题,请发布您分配适配器到列表视图的代码或相关代码。

同时也请提供xml布局代码。

希望这可以帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接