【问题标题】:Infinite Auto Scroll ListView with Scroll Speed Controlled具有滚动速度控制的无限自动滚动 ListView
【发布时间】:2012-12-19 12:19:37
【问题描述】:

我一直在研究ListViewidea,它可以在没有用户交互的情况下自动滚动,并且使用 android API 绝对可行,例如 smoothScrollToPositionFromTop

我已经实现了ListView BaseAdapter,它永远(几乎)加载项目,以得到一个不间断的自我重复ListView

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

下面是我正在尝试做的事情的 sn-p。结果不知何故还不错,但不够流畅,我能感觉到 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();

【问题讨论】:

  • 那么问题出在哪里?您已经实现了此功能(无限滚动),但想要提高流畅度/效率/减慢速度?
  • 定义“不够平滑”。这可能是由于您的适配器部分,某些项目可能加载缓慢。
  • @breadbin:更新,njzk2“不够流畅”我的意思是我可以看到列表视图变慢,然后再次滚动,这使它滞后。我需要滚动一次并且永远。
  • 我认为这是填充列表视图的问题。只需改进您的适配器并使用 viewHoledr 机制来填充列表视图。

标签: android listview scroll autoscroll


【解决方案1】:

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

您需要尝试其他变量值

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();
                        }
                    });

【讨论】:

  • 这似乎是一个优雅的解决方案,我现在不在我的开发机器上测试它,我会尽快告诉你。
  • 毫无疑问,你应该得到赏金,但我的无限适配器中的ListView 令人担忧,当listview scrollBy 似乎getView(...) 没有被调用所以我看到空滚动最后一个单元格后的单元格,滚动时是否需要使ListView 无效?
  • 我之前写过这篇关于如何自动滚动 ListView 的博文。我希望它有所帮助。只需动态更改像素滚动量即可轻松控制速度。 blog.jpardogo.com/…
  • @Ahmad Kayyali 只需将 listView.scrollBy(0, heightToScroll) 更改为 listView.scrollListBy(heightToScroll) 即可使用 ListView。
  • 不幸的是,scrollListBy 需要 API 级别 19,我将 min sdk 设置为 11。现在怎么办?
【解决方案2】:

这里有几点建议:Simulate onFling() programmatically instead of detecting it (Android)

Programmatically Fling ListView Android

在你的情况下,很难弄清楚你所说的足够平滑。通常平滑问题与列表视图的非最佳使用以及单元布局或适配器的 getView 方法内的视图创建/回收中的问题有关。

use a placeholder 吗? 还有一个重要的考虑因素是Drawables usage

我从来没有达到你想要的,但我想到的一个简单的想法是:

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

【讨论】:

  • 非常感谢您花时间回答我的问题,让我们谈谈它:第一个第一个链接使用InstrumentationTestCase,我相信我不能在我的应用程序我的意思是定期活动(如果我错了,请纠正我)。 2nd 其他链接与我的问题无关,我已经通过了自动滚动问题/实现。 3rd 是的,我绝对在使用占位符。 第 4 次我对实现无限适配器零关注:)
  • 让ListView自动滚动变慢怎么办?
  • 您可以尝试按偏移量而不是位置滚动:developer.android.com/reference/android/widget/…
  • 为了争论,假设scrolling by offset已经工作了,我要如何降低滚动速度?
  • 降低调用此方法的速度。没有?
猜你喜欢
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多