2015-07-06 6 views
19

मैं अपनी सूची की शुरुआत में अपना RecyclerView लूप वापस करने की कोशिश कर रहा हूं।मैं एक परिपत्र (अंतहीन) RecyclerView कैसे बना सकता हूं?

मैंने पूरे इंटरनेट पर खोज की है और जब मैं अपनी सूची के अंत तक पहुंच गया हूं, तो मुझे पता चला है कि मैं यहां से आगे बढ़ना चाहता हूं।

यह वही मैं वर्तमान सूची के अंत का पता लगाने के उपयोग कर रहा हूँ है (here पाया जाता है):

@Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 

     visibleItemCount = mLayoutManager.getChildCount(); 
     totalItemCount = mLayoutManager.getItemCount(); 
     pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition(); 

     if (loading) { 
      if ((visibleItemCount+pastVisiblesItems) >= totalItemCount) { 
       loading = false; 
       Log.v("...", ""+visibleItemCount); 
      } 
     } 
} 

जब अंत करने के लिए स्क्रॉल, मैं विचारों चाहते हैं, जबकि से डेटा प्रदर्शित दिखाई दे सकता है सूची के शीर्ष या सूची के शीर्ष पर स्क्रॉल किए जाने पर मैं सूची के नीचे से डेटा प्रदर्शित करूंगा।

उदाहरण के लिए:

View1 View2 View3 View4 View5

View5 View1 View2 View3 View4

+0

@DamianKozlak RecyclerView के रूप में बिल्कुल नहीं के ListView –

+1

@ChadBingham ही नहीं है, लेकिन इस समस्या को 'ListView' में की तरह एक ही समाधान का उपयोग कर हल किया जा सकता है। 'लिस्ट व्यू' और 'रीसाइक्लिंग व्यू' एडाप्टर दोनों को 'getCount() 'और' getItem() 'विधियां मिलीं। –

+0

क्या आपको कोई समाधान मिला?मैं एक ही समस्या पर काम कर रहा हूं, वर्तमान में मैं LinearLayoutManager से विस्तारित एक कस्टम लेआउट प्रबंधक लिखने की सोच रहा हूं। क्या आपने कभी अपना लक्ष्य प्राप्त किया है? –

उत्तर

42

यह अनंत बनाने का कोई तरीका नहीं है, लेकिन वहाँ इसे बनाने के लिए एक रास्ता है अनंत की तरह लग रहा है।

  1. अपने एडाप्टर ओवरराइड getCount() में

    कुछ बड़ा लौटने के लिए Integer.MAX_VALUE की तरह:

    @Override 
    public int getCount() { 
        return Integer.MAX_VALUE; 
    } 
    
  2. getItem() और getView() सापेक्ष विभाजन में

    (%) वास्तविक मद संख्या से स्थिति:

    @Override 
    public Fragment getItem(int position) { 
        int positionInList = position % fragmentList.size(); 
        return fragmentList.get(positionInList); 
    } 
    
  3. अंत में, वर्तमान आइटम को बीच में कुछ सेट करें (या फिर, यह केवल अंतहीन होगा नीचे की दिशा)।

    // scroll to middle item 
    recyclerView.getLayoutManager().scrollToPosition(Integer.MAX_VALUE/2); 
    
+0

अरे, यह वही है जो मैं करता हूं, लेकिन मैं नकारात्मक मूल्य के साथ smoothScrollToPosition() को कॉल नहीं कर सकता। मैं चाहता हूं कि मेरी सूची डीपीएड नियंत्रित हो और बाएं दिशा के साथ-साथ सही दिशा भी स्क्रॉल कर सके। – anhtuannd

+0

@anhtuannd MAX_INT/2 या प्रारंभिक स्थिति के रूप में जो कुछ भी उपयोग करें। – Tunga

+2

ग्रेट सॉल्यूशन! मैंने बेहतर समझ के लिए कोड जोड़ा। :) – Sufian

6

अन्य समाधान मैं इस समस्या को काम काफी अच्छी तरह से करने के लिए मिल गया है, लेकिन मैं वहाँ getCount में Integer.MAX_VALUE() recycler देखने की विधि लौटने कुछ स्मृति मुद्दों हो सकता है लगता है।

इसे ठीक करने के ओवरराइड getItemCount() के रूप में नीचे दी गई विधि:

@Override 
public int getItemCount() { 
    return itemList == null ? 0 : itemList.size() * 2; 
} 

अब भी आप स्थिति का उपयोग कर रहे सूची से आइटम प्राप्त करने के लिए नीचे दिए गए

position % itemList.size() 

का उपयोग अब scrollListener जोड़ने आपके रीसाइक्लर व्यू

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) 
     super.onScrolled(recyclerView, dx, dy); 
     int firstItemVisible = linearLayoutManager.findFirstVisibleItemPosition(); 
     if (firstItemVisible != 0 && firstItemVisible % itemList.size() == 0) { 
      recyclerView.getLayoutManager().scrollToPosition(0); 
     } 
    } 
}); 

अंततः ऑटो स्क्रॉलिंग शुरू करने के लिए, विधि को कॉल करें कम

public void autoScroll() { 
    final Handler handler = new Handler(); 
    final Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      recyclerView.scrollBy(2, 0); 
      handler.postDelayed(this, 0); 
     } 
    }; 
    handler.postDelayed(runnable, 0); 
} 
+0

अच्छा जवाब! मैं इसे स्वीकार किए गए एक से अधिक पसंद करता हूं। – Sakiboy

+0

मेरा समय धन्यवाद बचाया। –

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