2012-12-19 118 views
16

我一直在ListView知道它在哪兒自動保持,無需用戶交互滾動,並且使用了Android的API,例如smoothScrollToPositionFromTop是絕對可行的。無限自動滾動的ListView的滾動速率控制

我已經實施了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

+0

定義「不夠平滑」。這可能是由於你的適配器部分,一些項目可能會加載緩慢。 – njzk2

+0

@breadbin:更新,njzk2「不夠平滑」我的意思是我可以看到listview放緩,然後再次滾動,這使得它滯後。我需要滾動一次,永遠。 –

回答

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

它似乎是一個優雅的解決方案,我現在不在我的開發機器上進行測試,我會盡快通知您。 –

+3

毫無疑問,你應該得到賞金,但是在我的無限適配器中有一個關於'ListView'的問題,當listview scrollBy看起來'getView(...)'沒有被調用,所以我看到空單元格後最後一個單元格滾動,我需要在滾動時使'ListView'無效嗎? –

+0

我爲這個http://pastebin.com/9fUTuR1u寫了一些測試應用程序你是對的 - scrollBy以不正確的方式滾動Listview。但它在ScrollView中適用於我。順便說一句,如果在列表視圖中有少量項目,如果您在所有項目中嘗試帶有Linearlayout的ScrollView,則可以爲滾動添加更多平滑度。 – Berezovskyi

-1

以下幾個要點:Simulate onFling() programmatically instead of detecting it (Android)

Programmatically Fling ListView Android

很難找出你打電話不夠順暢在你的情況。通常,平滑度問題與適配器的getView方法中單元佈局或視圖創建/回收的列表視圖和故障的非最佳使用有關。

你是否use a placeholder? 重要的是要考慮的還有Drawables usage

我從來沒有達到你在找什麼,但想到一個簡單的想法是:

  • 找到一種方式來滾動的1位或2
  • 的視圖中使用的環形緩衝區內您的適配器。例如,假設您的項目列表中有100個項目。然後在開始處,列表視圖的項目0是您列表中的項目0。當listview向上滾動1個項目時,listview的項目0應該變成你的列表中的項目1。因此,問題不會滾動,而是更多的同步滾動和顯示無盡的項目列表。
+0

非常感謝您爲解答我的問題付出的努力,讓我們來談談它:** 1st **第一個鏈接使用'InstrumentationTestCase',我相信我不能在我的應用程序中使用它我的意思是定期的活動(糾正我如果我錯了)。 ** 2nd **其他鏈接與我的問題無關,我已通過自動滾動問題/實現。 **第3 **是絕對我正在使用佔位符。 **第四**我沒有關注實現無盡的適配器:) –

+0

如何減慢ListView自動滾動? –

+0

您可以嘗試通過偏移而不是位置進行滾動:http://developer.android.com/reference/android/widget/ListView.html#smoothScrollByOffset(int) – Snicolas