2012-08-17 88 views
13

我使用PagerAdapter。我有很多元素,所以我不會在同一時間加載所有元素。我重新加載適配器,我通過新元素更改舊元素。例如,我有4個元素,當我到達最後一個元素時,我重新加載元素,然後調用setCurentItem(1)以便能夠將viewpager顯示在位置1上。我做了很多測試。我把:ViewPager中的setCurrentItem不能立即滾動到正確位置

viewPager.setCurrentItem(1,false); //But not scroll, put drastically the new page. 
viewPager.setCurrentItem(1); 

我試圖修改onPageScrollStateChanged(INT爲arg0),我只有3次,並在中間總是ubicate。

if (arg0 == ViewPager.SCROLL_STATE_DRAGGING) { 
    if(focusedPage==2) { 
     //Modify adapter 
     viewPager.setCurrentItem(1,false); 

    }else if(focusedPage==0){ 
     //Modify adapter 
     viewPager.setCurrentItem(1,false); 
    } 

而且我tryed修改使用onPageSelected(INT爲arg0)

focusedPage=arg0; 

利用這最後的例子,我有立即滾動意見,但它始終位於最後一個頁面上。任何人都知道我可以如何滑動。

謝謝

回答

43

我可以更多地瞭解你所要完成什麼樣的背景?

無論如何,從我能理解的你試圖使一個「無限」ViewPager從最後一個到第一個,反之亦然(請糾正我,如果我錯了)。你希望你的ViewPager去第一頁,但滾動 - 不只是從無處出現。那麼,如果你禁用了平滑滾動(第二個參數),那麼它將直接進入你想要的沒有滾動運動的頁面(並且不會「改變」到其他頁面),並且如果你啓用平滑滾動,然後它會通過所有的意見,所以你會看到它不是下一個,但第一個。

/*No swipe animation, and no onPageChanged for the page in the middle*/ 
    mPager.setCurrentItem(1, false); 

    /*The same as if you do not add the second parameter*/ 
    mPager.setCurrentItem(1, true); 

    /*Your ViewPager scrolls through all the needed views until it arrives at that view.*/ 
    mPager.setCurrentItem(1); 

我能記住推薦給你,這是你可以嘗試添加在位置0「虛擬」視圖和「最後」,並認爲在位置0是一樣的位置「最後 - 1「和」最後「視圖將與位置」1「相同。所以你會做一切正常的事情,除了OnPageChangeListener你會檢查當前頁面是位置「0」還是「最後」,如果是,你會調用setCurrentItem(「1」,false)或setCurrentItem(「last - 1「,假)取決於你現在在哪個位置。通過這種方式,您可以在完成所需功能的同時保持「換頁」效果。

我希望這可以幫助你解決你的問題。

注: 它可能有一個laggy改變你在新的位置後到達,因爲它必須加載當前,未來和過去的觀點認爲(或者,如果你是4.0+那麼它將只加載實際位置)。

UPDATE:

如果更改列表/陣列決定了ViewPager的內容的內容,你需要調用:

ViewPager mPager = new ViewPager(); 
mPager.getAdapter().notifyDataSetChanged(); //This notify that you need to recreate the views 

/*This is if you want to change the data and then go to a specific position 
If you do not do this you will have a very Buggy Behavior*/ 
new Handler().post(new Runnable() { 
@Override 
public void run() { 
    mPager.setCurrentItem(2); //Where "2" is the position you want to go 
    } 
}); 

更新2:

爲什麼不將所有元素都添加到ViewPagerViewPager已經爲處理這些案件進行了優化,在我的情況下,我有很多元素,它的工作就像一個魅力。

另一件事,在您的代碼中,我看到您每次頁面「安定」時都會切換到中間頁面。但是,你真的從不展示正確的和左邊的觀點,那麼你爲什麼擁有它們呢?

最後一件事,當您更改數據集時,需要調用上面提到的「notifyDataSetChanged」方法,然後在處理程序中調用「setCurrentItem」方法。如果你不這樣做,你的應用程序將無法按預期工作。

更新3:

好了,我可以推薦是有,你不斷增加,你從數據庫中帶來的,然後只要你保持插入對象的新對象列表中的唯一的事情列表的結尾沒有問題。如果你想在中間或開始處添加對象,那麼你需要調用notifyDataSetChanged,但這樣會很慢,因爲它會再次生成視圖。我們這樣做,它完美的工作,我們甚至從服務器下載信息,數據不是本地的(實際上,我們將信息添加到列表的結尾和開始)。

如果您有任何其他問題關於如何實現這一點不要猶豫,問。

UPDATE 4:

萬一有人實際上是尋找一個圓形ViewPager,我添加了一個proof of concept code,你可以重新使用。它的工作原理沒有問題,我用它來表達複雜的觀點,而且沒有任何延遲。

+0

感謝@Jorge阿吉拉爾。我用過你的想法,但我改變了一些東西。我添加了「虛擬」視圖,但我有不同的看法。例如,如果我有a,b,c,d,e。我已經第一次了:a,a,a。和setCurrentItem(1,false)。當用戶滾動到下一個viewpager時,它是:a,b,c和setCurrentItem(1,false),...在onPageScrollStateChanged我已經把這個代碼。但現在我有一個小問題。如果用戶想快速滾動,他們不能,因爲有任何延遲。你有什麼主意嗎?謝謝 – MARM 2012-08-21 08:58:09

+0

您是否可以編輯您的問題或發佈有關新問題的更多詳細信息的新問題,以更好地瞭解您並更好地幫助您。我已經更新了答案以添加一些有價值的東西。如果您可以將此標記爲任何人進入的答案,他們可以知道已解決。 – 2012-08-21 15:11:25

+0

我編輯了我的問題。 – MARM 2012-08-21 16:02:35

1

它不無postDelayed工作,請嘗試使用此代碼:

viewPager.postDelayed(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     viewPager.setCurrentItem(num, true); 
    } 
}, 100); 
相關問題