2012-04-17 20 views
9

मेरे पास कुछ विचारों के साथ एक ViewPager है। आखिरी बार सही स्वाइप करने के बाद मैं पहले व्यक्ति के पास जाना चाहूंगा।व्यूपेजर लूप कैसे बनाएं?

मैं

@Override 
public Fragment getItem(int arg0) { 
    int i = arg0 % fragmentList.size(); 
    return fragmentList.get(i); 
} 

@Override 
public int getCount() { 
    return fragmentList.size()+1; 
} 

की कोशिश की लेकिन मैं एक त्रुटि

E/AndroidRuntime(22912): java.lang.IllegalStateException: Fragment already added: RubricFragment{4136cd80 #1 id=0x7f06000c android:switcher:2131099660:0} 
+0

जांच इस http://stackoverflow.com/q/7546224/1263908 – sique

+0

http://stackoverflow.com/questions/7440012/infinite-viewpager – blessenm

उत्तर

5

मिला मैं ViewPager के अंत में एक डमी पेज बना सकेगी। तब उपयोगकर्ता इस पृष्ठ का उपयोग पहले पृष्ठ पर जाने के लिए करता है जब उपयोगकर्ता डमी पेज पर स्क्रॉल करता है। मैं जानता हूँ कि यह सही से दूर है: डी

@Override 
public void onPageScrolled(int position, float arg1, int arg2) { 
    if (position >= NUM_PAGE-1) { 
     mViewPager.setCurrentItem(0, true); 
    } 
} 
+0

इस अगर आप वैसे, हाँ, आप अनंत स्क्रॉलिंग प्राप्त कर सकते हैं लेकिन आखिरी पेज में स्क्रॉल किए जाने पर आपको एनीमेशन दिखाई देगा जैसे कि scren1 पर वापस जा रहा है .. –

24

एक संभावना यह इस तरह स्क्रीन स्थापित कर रही है:

सी 'ABCA'

सी 'सिर्फ सी की तरह लग रहा है, लेकिन आप वहाँ के लिए स्क्रॉल जब , यह असली सी एक करने के लिए आप स्विच सिर्फ एक की तरह लग रहा है, लेकिन जब तुम वहाँ के लिए स्क्रॉल, यह आप वास्तविक ए पर स्विच करता है

मैं 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 गुजरता कूद तुरन्त बल्कि एक चिकनी स्क्रॉल के रूप में की तुलना में ऐसा करने के लिए पैदा करने के लिए।

इसमें दो मुख्य दोष हैं जिन्हें मैं देखता हूं। सबसे पहले, किसी भी अंत तक पहुंचने पर उपयोगकर्ता को आगे बढ़ने से पहले स्क्रॉलिंग को व्यवस्थित करना होगा। दूसरा, इसका मतलब है कि आपके पहले और अंतिम पृष्ठ में सभी विचारों की दूसरी प्रतिलिपि है। इस पर निर्भर करता है कि आपकी स्क्रीन कितनी संसाधन-भारी है, जो इस तकनीक को संभावित समाधान के रूप में रद्द कर सकती है।

ध्यान दें कि चूंकि दृश्य पेजर स्क्रॉलिंग के निपटारे के बाद तक अंतर्निहित नियंत्रणों तक क्लिक नहीं करता है, इसलिए शायद क्लिकलिस्टर्स और ए 'और सी' टुकड़ों की तरह सेट करना ठीक नहीं है।

संपादित करें: अब इसे स्वयं लागू करने के बाद, एक और सुंदर बड़ी कमी है। जब यह ए 'से ए या सी' से सी तक स्विच करता है, तो कम से कम मेरे वर्तमान परीक्षण डिवाइस पर स्क्रीन एक पल के लिए झिलमिलाहट करता है।

+0

शानदार उत्तर! मैंने इसका इस्तेमाल किया और यह सही काम करता है! – vandzi

+0

हाय, क्या आपको झिलमिलाहट से बचने का कोई रास्ता मिल सकता है? – RMalke

+0

मेरे काम के लिए अद्भुत समाधान! Thx – mbelsky

0

इस डमी पृष्ठों के बिना काम करना चाहिए:

private boolean isFirstOrLastPage; 
private int currentPageIndex = 0; 


@Override 
public void onPageScrolled(int arg0, float arg1, int arg2) { 
    if(currentPageIndex!=arg0){ 
     isFirstOrLastPage = false; 
     return; 
    } 
    if((arg0==0 || arg0==PAGES.size()-1) && arg1 == 0 && arg2 == 0){ 
     if(isFirstOrLastPage){ 
       //DO SOMETHING 
     }else{ 
      isFirstOrLastPage = true; 
     } 
    } 
} 

@Override 
public void onPageSelected(int arg0) { 
    currentPageIndex = arg0; 
} 
0

इस काम करता है, स्वीकार किए जाते हैं जवाब नहीं अच्छा एक अंतराल है, क्योंकि जब पाश होता है:

@Override 
public int getCount() { 
    return Integer.MAX_VALUE; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    String title = mTitleList.get(position % mActualTitleListSize); 
    return title; 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    int virtualPosition = position % mActualTitleListSize; 
    return super.instantiateItem(container, virtualPosition); 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    int virtualPosition = position % mActualTitleListSize; 
    super.destroyItem(container, virtualPosition, object); 
} 

जवाब यहाँ से लिया: ViewPager as a circular queue/wrapping

1

मेरा समाधान benkc पर आधारित है, लेकिन पहले और अंतिम पृष्ठ स्क्रॉल एनीमेशन अक्षम हैं, और जब पृष्ठ वास्तविक पृष्ठ पर "स्क्रॉल" होते हैं, तो स्क्रॉल एनीमेशन फिर से सक्षम होता है, यह योजना पहली कमी को हल कर सकती है।

लेकिन मेरे ViewPager.setCurrentItem(position, false) परिणाम अभी भी स्क्रॉल एनीमेशन है, इसलिए मैं एनीमेशन लागू करता हूं जो देखने के लिए बहुत तेज़ है।

इस तरह तेजी से स्क्रॉल एनीमेशन, टिप्पणी कोई आपत्ति नहीं है, बस अपना कोड इन विधि का उपयोग नहीं किया:

public class FixedSpeedScroller extends Scroller { 
    private int mDuration = 0; 

    public FixedSpeedScroller(Context context) { 
     super(context); 
    } 

    @Override 
    public void startScroll(int startX, int startY, int dx, int dy, int duration) { 
     super.startScroll(startX, startY, dx, dy, mDuration); 
    } 

    @Override 
    public void startScroll(int startX, int startY, int dx, int dy) { 
     super.startScroll(startX, startY, dx, dy, mDuration); 
    } 
} 

और viewpager की गतिविधि करने के लिए इस विधि का उपयोग

private Scroller scroller; 
private void setViewPagerScroll(boolean instant) { 
    try { 
     Field mScroller = null; 
     mScroller = ViewPager.class.getDeclaredField("mScroller"); 
     mScroller.setAccessible(true); 
     if (scroller == null) { 
      scroller = (Scroller) mScroller.get(mViewPager); 
     } 
     FixedSpeedScroller fss = new FixedSpeedScroller(mViewPager.getContext()); 
     mScroller.set(mViewPager, instant ? fss : scroller); 

    } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
} 

और PageScrollState को संशोधित करें इस तरह से बदलें, केवल पहला पृष्ठ या अंतिम पृष्ठ (मेरे पास 5 पृष्ठ हैं) एनीमेशन को तेज़ स्क्रॉलिंग में बदल देगा, अन्यथा सामान्य स्क्रॉलिंग होगी:

public void onPageScrollStateChanged(int state) { 
    if (state == ViewPager.SCROLL_STATE_IDLE) { 
     if (position == 0) { 
      setViewPagerScroll(true); 
      mViewPager.setCurrentItem(3); 

     } else if (position == 4) { 
      setViewPagerScroll(true); 
      mViewPager.setCurrentItem(1); 

     } else { 
      setViewPagerScroll(false); 
     } 
    } 
} 

FixedSpeedScroller संदर्भ यहाँ है: http://blog.csdn.net/ekeuy/article/details/12841409

संबंधित मुद्दे