无限自动滚动的ListView,可控制滚动速度

16

我一直在开发一个ListView的想法,它可以在没有用户交互的情况下自动滚动,使用安卓API是绝对可行的,例如smoothScrollToPositionFromTop

我已经实现了ListView BaseAdapter,它可以无限加载条目,从而实现不停止自我重复的ListView

我想要实现的目标是让我的ListView以一定的速度(慢速)永远滚动,使得向下滚动时项目清晰易读。我还不确定ListView是否是我在这里的最佳选择。

以下是我试图做到的一部分内容。结果还可以,但不够流畅,我能感觉到ListView闪烁。

我需要改进平滑度、效率并控制速度.

new Thread(new Runnable() {

    @Override
    public void run() {
        int listViewSize = mListView.getAdapter().getCount();

        for (int index = 0; index < listViewSize ; index++) {
            mListView.smoothScrollToPositionFromTop(mListViewA.getLastVisiblePosition() + 100, 0, 6000);
            try {
                // it helps scrolling to stay smooth as possible (by experiment)
                Thread.sleep(60);
            } catch (InterruptedException e) {

            }
        }
    }
}).start();

1
那么问题是什么?您已经实现了这个功能(无限滚动),但想要提高平滑度/效率/减慢速度? - breadbin
定义“不够流畅”。这可能是由于您的适配器部件引起的,某些项目可能加载缓慢。 - njzk2
@breadbin:已更新,njzk2说“不够流畅”,我的意思是我可以看到列表视图减速然后再次滚动,这使得它很卡顿。我需要滚动一次就能一直保持流畅。 - Ahmad Kayyali
我认为问题出在填充ListView上。只需改进您的适配器并使用ViewHolder机制来填充ListView即可。 - Zala Janaksinh
2个回答

15

我建议您的适配器以有效的方式实现。所以这段代码只是用于滚动列表视图。

您需要尝试其他变量值。

final long totalScrollTime = Long.MAX_VALUE; //total scroll time. I think that 300 000 000 years is close enouth to infinity. if not enought you can restart timer in onFinish()

final int scrollPeriod = 20; // every 20 ms scoll will happened. smaller values for smoother

final int heightToScroll = 20; // will be scrolled to 20 px every time. smaller values for smoother scrolling

listView.post(new Runnable() {
                        @Override
                        public void run() {
                                new CountDownTimer(totalScrollTime, scrollPeriod ) {
                                    public void onTick(long millisUntilFinished) {
                                        listView.scrollBy(0, heightToScroll);
                                    }

                                public void onFinish() {
                                    //you can add code for restarting timer here
                                }
                            }.start();
                        }
                    });

3
毫无疑问,你应该得到这份奖赏,但是我有一个关于我的无限适配器中的 ListView 的担忧,当 ListView 使用 scrollBy 滚动时,似乎 getView(...) 方法没有被调用,因此在滚动到最后一个单元格后,我看到了空白的单元格。我需要在滚动时使 ListView 无效吗? - Ahmad Kayyali
我会在 ScrollView 上尝试这个,但那样做会违背无限适配器的初衷。你觉得呢? - Ahmad Kayyali
1
我之前写了一篇关于如何自动滚动ListView的博客文章,希望能对大家有所帮助。通过动态更改滚动的像素数量,很容易控制滚动速度。链接:http://blog.jpardogo.com/autoscroll-a-listview-with-listviewautoscrollhelper/ - jpardogo
3
@Ahmad Kayyali 只需将listView.scrollBy(0, heightToScroll)更改为listView.scrollListBy(heightToScroll),就可以在ListView中使用了。 - Chris.Zou
1
很不幸,scrollListBy需要API 19级,而我的最小SDK设置为11。现在怎么办? - Jasper
显示剩余3条评论

-1

以下是一些指针:模拟 onFling() 以编程方式而非检测它(Android)

在 Android 上编程 Fling ListView

很难确定您在这种情况下所谓的光滑程度。通常,平滑度问题与列表视图的非最佳使用以及 getView 方法中单元格布局或视图创建/回收方面的问题有关。

您是否使用占位符? 还要考虑一个重要的事情Drawables 的使用

我从未实现过您要寻找的内容,但我想到了一个简单的想法:

  • 找到一种滚动视图1个或2个位置的方法。
  • 在您的适配器内使用环形缓冲区。例如,假设您的项目列表中有100个项目。然后,在开始时,listview的第0项是您列表中的第0项。当listview向上滚动1个项目时,listview的第0项应成为您列表中的第1项。因此,问题不在于滚动,而在于与滚动同步并显示无限项目列表。

非常感谢您花时间回答我的问题,让我们来谈谈它:1st 第一个链接使用 InstrumentationTestCase,我相信我不能在我的应用程序中使用它,我的意思是在常规活动中(如果我错了,请纠正我)。 2nd 另一个链接与我的问题无关,我已经解决了自动滚动问题/实现。 3rd 是的,我绝对在使用占位符。 4th 我完全不担心实现无尽适配器 :) - Ahmad Kayyali
减缓ListView自动滚动的速度怎么样? - Ahmad Kayyali
你可以尝试使用偏移量而不是位置进行滚动:http://developer.android.com/reference/android/widget/ListView.html#smoothScrollByOffset(int) - Snicolas
假设“按偏移量滚动”已经起作用了,我该如何减慢滚动速度呢? - Ahmad Kayyali
减缓调用此方法的速度。不是吗? - Snicolas

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