2013-05-16 7 views
14

ViewPager का एक उपयोग-मामला है जिसे मैंने कभी भी लागू नहीं किया है।दोनों दिशाओं में असीमित/गतिशील व्यूपेजर

ViewPager कम या ज्यादा स्थैतिक संरचना है। पेजों को दाएं तरफ जोड़ने (मॉडल में जोड़ने और इसे प्रदर्शित करने) में इतना मुश्किल नहीं है, हालांकि, पेजर एडाप्टर (या इसके कुछ उप-वर्गों) का विस्तार करने के लिए उपयोग में आसान समाधान होना चाहिए ताकि यह दोनों दिशाओं में विस्तार हो सके।

मैं इस

boolean isEmpty() 
boolean hasNext() 
boolean hasPrevious() 
Object getNext() 
Object getPrevious() 
Object getItem(int position) 

// or if using generics 
T  getNext() 
T  getPrevious() 
T  getItem(int position) 

संग्रह इटरेटर के समान की तरह एडाप्टर के लिए इंटरफ़ेस कल्पना कर सकते हैं, लेकिन दोनों दिशाओं।

जहां सूचकांक/स्थिति 0 से नीचे सीमित नहीं है, लेकिन पूर्णांक प्रकार की पूरी श्रृंखला का उपयोग कर सकते हैं।
शायद सरणी पर कार्यान्वयन का आधार नहीं है (जो अनंत तक 0 है)।

मैंने पाया इस "हैक": dynamically add and remove view to viewpager
लेकिन जैसा कि मैंने पहले कहा, मैं यह स्वाभाविक रूप से काम कर रहे, को बनाए रखने 3,5, ... आइटम नहीं मिलता है और आधार पर वर्तमान स्थिति को बदलने के ViewPager मजबूर करने के लिए कोशिश कर रहा हूँ कुछ मुड़ तर्क पर

क्या वर्तमान में कोई पर्याप्त कार्यान्वयन है या इसे लागू करने के लिए आवश्यक है?
मैं इनाम का जवाब देने के लिए तैयार हूं, अगर यह एक नया नया कार्यान्वयन होगा।

+0

हम ViewPager में विचारों के किसी भी संख्या .. जोड़ सकते हैं और मैं एक ही लागू कर दिया है मेरे ऐप्स में से एक में। ViewPager के @FoamyGuy सरल डेमो पर एक नज़र डालें, जिसमें हमारे पास असीमित संख्या में पेज https://github.com/FoamyGuy/MathFactCards – Pragnani

+0

@Pragnani हो सकते हैं लेकिन आप केवल सही दिशा में विस्तार कर रहे हैं, मैं कोशिश कर रहा हूं हैक के बिना गतिशील रूप से दोनों दिशाओं में मिलता है। –

+0

@ प्रग्नानी आप असीमित पृष्ठों को जोड़ सकते हैं लेकिन केवल 1 दिशा में। मुझे लगता है कि उनका प्रश्न अलग है। – TheFlash

उत्तर

7

क्या यह मदद,

public static class MyAdapter extends FragmentPagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     return getFragmentBasedOnPosition(position); 
    } 

    private Fragment getFragmentBasedOnPosition(int position) { 
     int fragmentPos = position % 3; // Assuming you have 3 fragments 
     switch(fragmentPos) { 
      case 1: 
      return Fragment1.newInstance(); 
      case 2: 
      return Fragment2.newInstance(); 
      case 3: 
      return Fragment3.newInstance(); 
     } 
    } 
} 

और फिर,

mPager.setCurrentItem((int)(Integer.MAX_VALUE/2)); // संभालने mPager अपने ViewPager है

+1

यह किसी भी तरह से मदद करेगा, धन्यवाद, लेकिन फिर भी यह मुझे अजीब समाधान की तरह लगता है। –

+3

यह एक FragmentStatePagerAdapter के साथ काम नहीं करेगा क्योंकि इसे प्रत्येक खंड की गणना करने की आवश्यकता होगी। और परिणामस्वरूप एक स्मृति ओवरफ्लो में परिणाम – Hrk

2

नकारात्मक स्थिति मानों का उपयोग बहुत व्यूपेगर उपयोग के प्राकृतिक क्रम से बहुत दूर है और एडाप्टर समस्या बिल्कुल नहीं है। एंड्रॉइड एसडीके में समर्थन पैकेज स्रोत में ViewPager के स्रोत कोड पर एक नज़र डालें।

void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) { 
    if (mAdapter == null || mAdapter.getCount() <= 0) { 
     setScrollingCacheEnabled(false); 
     return; 
    } 
    if (!always && mCurItem == item && mItems.size() != 0) { 
     setScrollingCacheEnabled(false); 
     return; 
    } 

    if (item < 0) { 
     item = 0; 
    } else if (item >= mAdapter.getCount()) { 
     item = mAdapter.getCount() - 1; 
    } 
    final int pageLimit = mOffscreenPageLimit; 
    if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) { 
     // We are doing a jump by more than one page. To avoid 
     // glitches, we want to keep all current pages in the view 
     // until the scroll ends. 
     for (int i=0; i<mItems.size(); i++) { 
      mItems.get(i).scrolling = true; 
     } 
    } 
    final boolean dispatchSelected = mCurItem != item; 
    populate(item); 
    scrollToItem(item, smoothScroll, velocity, dispatchSelected); 
} 

आप देख सकते हैं, ViewPager स्पष्ट मान लिया गया कोई नकारात्मक स्थिति मान: उदाहरण के लिए, यहाँ एक setCurrentItemInternal निजी कार्यान्वयन है।

+0

और निष्कर्ष क्या है? मैं नकारात्मक सूचकांक का उपयोग नहीं करना चाहता था। मुझे अपने कस्टम मॉडल के आधार पर असीमित दोनों दिशाओं में संग्रह के माध्यम से चलने की आवश्यकता है। मैंने सीधे कहा, कि समाधान शायद ऐरे पर आधारित नहीं होना चाहिए, क्योंकि हमें नकारात्मक सूचकांक से निपटना होगा। –

+0

आपने लिखा: "जहां सूचकांक/स्थिति 0 से नीचे सीमित नहीं है, लेकिन पूर्णांक प्रकार की पूरी श्रृंखला का उपयोग कर सकते हैं।" आप इन इंडेक्स का उपयोग कहां करना चाहते हैं? यदि वर्तमान पृष्ठ पर या सेट हैंडलर पर सेट करें, तो ऊपर की समस्या उत्पन्न होती है। यदि नकारात्मक सूचकांक ViewPager को दिखाई नहीं दे रहे हैं, तो * ऐसी * इंडेक्स का अर्थ क्या है? कृपया विस्तृत करें ... –

+0

मैं संभावित तत्वों की सीमा के बारे में बात कर रहा था, इंटरफ़ेस रूपरेखा में मुझे इंडेक्स की आवश्यकता नहीं है, लेकिन मुझे दोनों दिशाओं में गतिशील रूप से संग्रह का विस्तार करने की आवश्यकता है। ताकि कॉलिंग प्राप्त हो सके PreviousItem एलिमेंट (0) पर समाप्त नहीं होता है लेकिन कस्टम मॉडल में लागू कुछ अन्य शर्त पर निर्भर करता है। –

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

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