2012-07-04 63 views
5

在薑餅中,我沒有使用smoothScrollToPosition()一次滾動幾十個項目的問題。在我的Nexus S升級到冰淇淋三明治後,我注意到無論我放在smoothScrollToPosition()中,它只會在兩個方向上滾動大約幾百個像素,然後停止。smoothScrollToPosition()僅在Android ICS中部分滾動?

這是ICS的一個已知問題嗎?我也注意到了Galaxy Nexus的這一點。我查看了其他一些問題,並嘗試了一些不同的技巧,例如關閉對notifyDataSetChanged()的調用,並將smoothScrollToPosition()作爲延遲可運行時間發佈,但不幸的是,它不想滾動多於一個在停止之前有一百個像素左右。 :(

+2

我有同樣的問題。 http://code.google.com/p/android/issues/detail?id=37278 – bigstones

+1

我發佈了一個解決方法。 – bigstones

+0

這似乎是固定在軟糖。 –

回答

12

似乎是完成動畫所需的持續時間問題,smoothScrollBy(int distance,int duration)存在同樣的問題,粗略瀏覽一下,smoothScrollToPosition()是一個用於smoothScrollBy() smoothScrollBy()反過來僞裝一個「扔手勢」,就好像用戶已經做出了動作一樣。

smoothScrollBy真的只是發佈了可以繼續自我更新的投擲runnable,直到持續時間運行這意味着它只是根據之前決定移動的偏移量來計算所需的滾動偏移量,因此如果在達到目標偏移量之前持續時間耗盡,它會停止在最後計算的偏移量處(而不是所有突然跳躍到目標偏移量,這是perhap因爲它不會動畫)。

Android傢伙的困難在於確定每次run()調用移動多少以達到所需的偏移量,因爲ListView單元格(兒童)的高度完全是動態的,所以他們不能只做簡單的距離計算因爲他們不知道孩子的身高。同樣的道理,Android滾動條的大小可能會隨着滾動而波動,因此必須根據當前所看到的大小猜測它的大小。

反正不幫你解決這個問題,而有些會覺得很有趣:)

如果你知道你有靜態的單元格高度然而,你可以寫你自己的方法來計算距離和時間傳遞自己smoothScrollBy(),並有一個靜態的時間移動X距離。如果你不這樣做,它將只能使用發佈的解決方案大事件,因爲1000毫秒的SCROLL_DURATION高,所以確實可行。您可以使用ICS版本並更改此屬性,而不是使用不是根本原因的2.2版本。

你也可以使用你自己的自定義算法來調整這些可運行的程序,調整它們不應該太困難。

0

因爲ListView使用getChildCount()方法獲取AbsListView.java源代碼中的位置計數。但在ListView中,getChildCount()方法無法正確計數。也許你應該使用setSelection()方法。

2

這是我爲解決問題所做的。實質上,我們希望不斷調用平滑滾動,直到達到所需的元素(在這種情況下,我只是想滾動到頂部,即元素0)。

//There is a known bug where smoothScrollToPosition(..) may not reach the top, 
      //if the list is very large, keep scrolling until you reach the top element 
      newsFeed.setOnScrollListener(new OnScrollListener() { 
       @Override 
       public void onScrollStateChanged(AbsListView view, int scrollState) { 

       } 

       @Override 
       public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 
        if(firstVisibleItem != 0) { 
         newsFeed.smoothScrollToPosition(0); 
        } 
        else { 
         //We are done 
         newsFeed.setOnScrollListener(null); 
        } 
       } 
      }); 
      newsFeed.smoothScrollToPosition(0); 
0

我在ICS上也有問題。

我有一個聊天消息列表活動,每次我發送消息後,我需要順利滾動列表視圖到底部。所以在我調用notifyDataSetChanged()之後,我調用了方法smoothScrollToPosition()。在其他Android構建版本上,它運行良好。但在ICS上,這很奇怪。如果我的listview在底部,我測試了3個案例。如果我將一個新項目追加到列表視圖中,它將不會滾動。如果我追加兩個新項目到列表視圖 - >它會很好地滾動。如果我滾動列表視圖幾個像素,我追加一個新的項目後,它會很好地滾動。經過很多谷歌搜索和測試,我對此感到無奈。最後,每次我將數據設置爲列表視圖時,我會在最後一個位置添加一個空視圖(1px),儘管這不是一個好方法,但它適用於我。

2

如果您的目標是滾動到頂部,請考慮使用smoothScrollToPositionFromTop(0,0)。代替。

相關問題