2017-06-29 17 views
8

में ठीक से काम नहीं करता है मेरे पास क्षैतिज स्क्रॉलिंग आंतरिक रीसाइक्लिंग दृश्यों के साथ लंबवत स्क्रॉलिंग RecyclerView है।scrollBy नेस्टेड रीसाइक्लर्विव

expl

इस कार्यान्वयन के साथ

, उन तुल्यकालिक प्रत्येक क्षैतिज recyclerview स्क्रॉल कर सकते हैं। हालांकि, जब कोई उपयोगकर्ता मूल रीसाइक्लर व्यू के लिए लंबवत स्क्रॉल करता है, तो एक नया क्षैतिज रीसाइक्लर्विव जो विंडो पर अभी संलग्न है, उसी स्क्रॉल x स्थिति पर प्रदर्शित नहीं होता है। यह सामान्य बात है। क्योंकि यह अभी बनाया गया है।

तो, मैंने प्रदर्शित होने से पहले स्क्रॉल की गई स्थिति पर स्क्रॉल करने का प्रयास किया था। बस इस तरह:

नोट: यह अभिभावक पुनर्नवीनीकरण के एडाप्टर में है जिसका अभिविन्यास लंबवत है।

@Override 
    public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { 
     super.onViewAttachedToWindow(holder); 
     CellColumnViewHolder viewHolder = (CellColumnViewHolder) holder; 
     if (m_nXPosition != 0) { 
      // this doesn't work properly 
      viewHolder.m_jRecyclerView.scrollBy(m_nXPosition, 0); 
     } 
    } 

enter image description here

आप देख सकते हैं, scrollByपंक्ति 10, पंक्ति 11, पंक्ति 12 और पंक्ति 13 उसके बाद के लिए प्रभावित नहीं करता, मैं करने के लिए कोड डिबग क्या हो रहा है यह पता लगाने में सक्षम हो। जब मैं scrollBy, childCount का उपयोग कर पुस्तक स्थिति सेट() पंक्ति 10, पंक्ति 11, पंक्ति 12 और पंक्ति 13 तो वे स्क्रॉल नहीं है के लिए शून्य लौट आते हैं। पर क्यों ? और दूसरों क्यों काम करते हैं?

  • मैं इसे कैसे ठीक कर सकता हूं?
  • क्या नया दृश्य पुनर्नवीनीकरण दृश्य स्क्रॉल करने के लिए सही दृश्य है ViewAttachedToWindow सही जगह है?

नोट: मैं भी scrollToPosition() का परीक्षण किया है, यह किसी भी समस्या के इस तरह नहीं होती है। लेकिन मैं इसे अपने मामले में उपयोग नहीं कर सकता। चूंकि उपयोगकर्ता किसी भी एक्स स्थिति में स्क्रॉल कर सकते हैं जो सटीक स्थिति नहीं हो सकता है। इसलिए मुझे स्थिति के बजाय एक्स मान का उपयोग करके स्क्रॉल स्थिति सेट करने की आवश्यकता है।

संपादित: आप देख सकते हैं The source code

+0

क्या आप इस कोड को जिथब या किसी अन्य जगह में साझा कर सकते हैं, इसलिए –

+0

को डीबग करना आसान है मैंने अपना प्रश्न संपादित किया है। आप पूरा कोड देख सकते हैं। – ziLk

+0

क्यों नहीं चल रहा है? – natario

उत्तर

4

मैं एक समाधान है कि scrollToPositionWithOffset विधि बजाय scrollBy का उपयोग कर का उपयोग पाया। यहां तक ​​कि यदि दोनों एक और स्थिति को स्क्रॉल करते हैं, तो उनके पास पिछली तरफ वास्तव में अलग-अलग कार्य प्रक्रिया है।

उदाहरण के लिए: आप scrollBy उपयोग करने के लिए किसी भी पिक्सेल स्थिति स्क्रॉल करने के लिए कोशिश करते हैं और अपने recyclerView किसी भी अनुकूलक जिसका अर्थ है वहाँ प्रदर्शित करने के लिए कोई किसी भी डेटा है और इसलिए यह नहीं है अभी तक कोई किसी भी आइटम है, तो scrollBy सेट नहीं किया गया था, तो काम। RecyclerView अपने लेआउट प्रबंधक का scrollBy विधि का उपयोग करता है। तो मेरे मामले में, मैं क्षैतिज पुनर्चक्रण दृश्यों में LinearLayoutManager का उपयोग कर रहा हूं।

int scrollBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { 
     if (getChildCount() == 0 || dy == 0) { 
      return 0; 
     } 
     mLayoutState.mRecycle = true; 
     ensureLayoutState(); 
     final int layoutDirection = dy > 0 ? LayoutState.LAYOUT_END : LayoutState.LAYOUT_START; 
     final int absDy = Math.abs(dy); 
     updateLayoutState(layoutDirection, absDy, true, state); 
     final int consumed = mLayoutState.mScrollingOffset 
       + fill(recycler, mLayoutState, state, false); 
     if (consumed < 0) { 
      if (DEBUG) { 
       Log.d(TAG, "Don't have any more elements to scroll"); 
      } 
      return 0; 
     } 
     final int scrolled = absDy > consumed ? layoutDirection * consumed : dy; 
     mOrientationHelper.offsetChildren(-scrolled); 
     if (DEBUG) { 
      Log.d(TAG, "scroll req: " + dy + " scrolled: " + scrolled); 
     } 
     mLayoutState.mLastScrollDelta = scrolled; 
     return scrolled; 
    } 

आप देख सकते हैं scrollBy पर ध्यान नहीं देता स्क्रॉल इरादों अगर वहाँ उस समय कोई किसी भी बच्चे है:

देखें कि यह क्या कर रही है देता है।

if (getChildCount() == 0 || dy == 0) { 
    return 0; 
    } 

दूसरी ओर scrollToPosition पर पूरी तरह से काम कर सकते हैं किसी भी सेट डेटा अभी तक कोई है, भले ही।

Pro RecyclerView slide के अनुसार, नीचे नमूना पूरी तरह से काम करता है। हालांकि आप स्क्रॉल के साथ ऐसा नहीं कर सकते हैं।

void onCreate(SavedInstanceState state) { 
    .... 
    mRecyclerView.scrollToPosition(selectedPosition); 
    mRecyclerView.setAdapter(myAdapter); 
} 

एक परिणाम रूप में, मैं scrollToPositionWithOffset() उपयोग करने के लिए छोटी बात बदल गया है।

इस कार्यान्वयन से पहले मैं एक पिक्सेल के रूप में सटीक स्क्रॉल एक्स स्थिति की गणना कर रहा था।

उसके बाद, जब स्क्रॉल निष्क्रिय स्थिति आई, तो scrollToPositionWithOffset() के पहले पैरामीटर में पहली पूर्ण दृश्य स्थिति की गणना की गई।

ऑफ़सेट होने वाले दूसरे पैरामीटर के लिए, मुझे view.getLeft() फ़ंक्शन का उपयोग करके मूल्य मिल रहा है जो इस दृश्य की बाईं स्थिति को अपने माता-पिता के सापेक्ष प्राप्त करने में मदद करता है।

enter image description here

और यह पूरी तरह से काम करता है !!

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