2012-02-13 38 views
5

我想要做的是Android中的水平旋轉木馬。如何創建carousel ViewPager?

如果我有3個屏幕AB和C,那麼我想我ViewPager讓我動如 一個< - > B, 乙< - > C, Ç< - > A.

的GTalk的Android的對話可以像這樣切換。 三星的主屏幕和應用程序屏幕可以像這樣切換。

A B和C是碎片,我使用的是擴展FragmentPagerAdapter的適配器。所有的片段將包含一個webview。

我看了herehere在這裏,但他們似乎沒有做我想做的。

任何人都可以引導我在正確的方向嗎?

+0

您可以檢查[本教程(http://thedeveloperworldisyours.com/android/carousel-viewpager/#sthash.rtkOS5m2.J9bGU21I .dpbs)和[GitHub中的示例](https://github.com/thedeveloperworldisyours/CarouselViewPager) – Cabezas 2017-04-21 08:02:43

回答

0

落實getItem(int position)這樣的:

public Fragment getItem(int position) 
{ 
    switch(position) 
    { 
     case 0: 
     Fragment A = new A(); 
     return A; 
     case 1: 
     Fragment B = new B(); 
     return B; 
     same for C.... 
    } 
} 

你也可以看看這裏:SimpleViewPager ..下載源代碼並理解它。希望能幫助到你。

+0

我知道如何創建一個ViewPager。我想知道如何讓它循環。像屏幕a到b b到c c再次回來。 – Enigma 2012-02-13 11:42:38

+0

對不起,我以爲你問關於viewpager。 – Farhan 2012-02-13 11:48:02

3

(跨發佈my answer從相同的StackOverflow問題)

一種可能性是建立這樣的畫面:

C 'ABCA'

C」看起來就像C,但是當你滾動到那裏,它將你切換到真實的C。 A'看起來就像A,但當你滾動到那裏時,它會將你切換到真實的A.

我會通過執行onPageScrollStateChanged像這樣:

@Override 
public void onPageScrollStateChanged (int state) { 
    if (state == ViewPager.SCROLL_STATE_IDLE) { 
     int curr = viewPager.getCurrentItem(); 
     int lastReal = viewPager.getAdapter().getCount() - 2; 
     if (curr == 0) { 
      viewPager.setCurrentItem(lastReal, false); 
     } else if (curr > lastReal) { 
      viewPager.setCurrentItem(1, false); 
     } 
    } 
} 

注意,這個調用的setCurrentItem的另一種形式,並通過false造成跳轉到瞬間發生的,而不是一個平滑滾動。

我看到這個有兩個主要缺陷。首先,在達到任何一端時,用戶必須先讓滾動結束,然後才能繼續前進。其次,這意味着在第一頁和最後一頁中都有第二個副本。取決於屏幕的資源量,這可能會排除這種技術作爲一種可能的解決方案。

還要注意,由於視圖尋呼機不讓點擊通過底層控件,直到滾動結算之後,可能沒有爲A'和C'片段設置clicklisteners等。

編輯:現在自己實現了這個,還有另一個主要的缺點。當它從A'切換到A或C'切換到C時,屏幕至少會在當前的測試設備上閃爍片刻。

+0

我已經試過了。還有其他一些問題。如果A中某些觀點發生了變化,那麼A'也應該反映相同。就好像你已經在A中滾動,然後如果你去A',它會向你顯示未滾動的屏幕一秒鐘,並再次閃爍。 – Enigma 2012-10-19 07:04:23

1

ViewPager設置:

mViewPager = (ViewPager) findViewById(R.id.view_pager); 
    mViewPager.setAdapter(new YourPagerAdapter(getSupportFragmentManager())); 
    //Set the number of pages that should be retained to either side of the current page. 
    mViewPager.setOffscreenPageLimit(1); 
    mViewPager.setCurrentItem(50); 

FragmentPagerAdapter:

public class YourPagerAdapter extends FragmentPagerAdapter { 
    final int PAGE_COUNT = 100; 
    final int REAL_PAGE_COUNT = 3; 

    public YourPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     while (position > REAL_PAGE_COUNT - 1) { 
      position = position - REAL_PAGE_COUNT ; 
     } 

     switch (position) { 
      case 0: 
       return FirstFragment.newInstance(position); 
      case 1: 
       return SecondFragment.newInstance(position); 
      case 2: 
       return ThirdFragment.newInstance(position); 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     return PAGE_COUNT; 
    } 
}