9

भीतर RecyclerView मैं एक ऊर्ध्वाधर viewpager के भीतर एक recyclerview लागू करना चाहते हैं। मेरे वर्तमान लेआउट निम्नलिखितएंड्रॉयड: खड़ी viewpager

VerticalViewpager 
- Fragment1 
    - ImageView 
- Fragment2 
    - RecyclerView 

तरह लग रहा है अगर मैं Fragment1 से स्वाइप सब कुछ ठीक काम करता है Fragment2 करने के लिए। मैं recyclerview ऊपर और नीचे स्क्रॉल करने में सक्षम हूँ। समस्या तब होती है जब मैं स्वाइप करने/Fragment1 पर वापस स्क्रॉल करने का प्रयास करता हूं।

उपयोगकर्ता recyclerview के शीर्ष करने के स्क्रॉल किया गया है, तो मैं खड़ी viewpager के बगल में "अप" -Scroll घटना को आगे करना चाहते हैं। मैंने onInterceptTouchEvent विधि को ओवरराइड करने का प्रयास किया है, लेकिन दुर्भाग्यवश अभी भी कोई सफलता नहीं है। वहाँ कोई विचार है? धन्यवाद आपकी मदद :)

+0

हाय पर पृष्ठों के बीच एक अच्छा स्क्रॉलिंग जैसे लग रहे बनाने के लिए मिल गया था है! मुझे बिल्कुल वही काम करने की ज़रूरत है, कोई किस्मत? – Caique

+0

हाय @ कैक, दुर्भाग्य से कोई समाधान नहीं जो हमारे सभी मामलों में काम करता है। मिस्टर इंडिया से सुझाव हमारे लिए मददगार था, लेकिन जैसा कि मैंने पहले से ही अपने सुझाव नीचे मेरी टिप्पणी में उल्लेख किया है इस समाधान हर बार काम नहीं करता। उत्तर के लिए – jennymo

+0

Thks। मैंने जो किया था: मैंने पुनर्नवीनीकरण के टच को ओवरराइट किया, ACTION_DOWN, ACTION_MOVE और ACTION_UP से गति प्राप्त की, और यदि गति> 500 (कुछ वेग के साथ बढ़ रही है) तो मैं व्यूपेजर पर एक स्थिति वापस चला जाता हूं। यह बहुत अच्छा काम कर रहा है। मैं कोड के साथ एक जवाब के रूप पोस्ट करेंगे, शायद आप – Caique

उत्तर

2

के लिए आप scroll निष्क्रिय की जरूरत है। recyclerView.setNestedScrollingEnabled(false);

+1

हाय, आपके उत्तर के लिए धन्यवाद।मैंने इसे आज़माया और यह काम करता है ... कभी-कभी: डी अगर मैं रीसाइक्लिंगव्यू के शीर्ष पर पहुंच गया तो मुझे कम से कम चार या पांच बार स्क्रॉल करना होगा, जब तक वर्टिकल व्यूपाजर को ईवेंट नहीं मिल जाता है और वापस Fragment1 पर स्क्रॉल करता है। कोई विचार क्या इस व्यवहार का कारण बनता है? – jennymo

2

1) आपको समर्थन पुस्तकालय 23.2.0 (या) 2 से ऊपर उपयोग करने की आवश्यकता है) और पुनर्चक्रण दृश्य ऊंचाई wrap_content होगी। 3) recyclerView.setNestedScrollingEnabled (गलत)

लेकिन इस recycler पैटर्न काम नहीं करते करके। (यानी सभी विचार एक बार लोड हो जाएंगे क्योंकि wrap_content को पूर्ण रीसाइक्लर की ऊंचाई की आवश्यकता है, इसलिए यह सभी रीसाइक्लिंग दृश्यों को एक बार में आकर्षित करेगा। कोई दृश्य पुनर्नवीनीकरण नहीं किया जाएगा)। इस पैटर्न के उपयोग को तब तक उपयोग न करने का प्रयास करें जब तक कि यह वास्तव में आवश्यक न हो।

1
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
       @Override 
       public void onScrolled (RecyclerView recyclerView,int dx, int dy) { 
       int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop(); 
       if (topRowVerticalPosition >= 0) { 
        //top position 
       } 
      } 
       @Override 
       public void onScrollStateChanged (RecyclerView recyclerView,int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
      } 
      }); 

इस कोड का उपयोग करके आप यह पता लगा सकते हैं कि उपयोगकर्ता शीर्ष स्थिति में है या नहीं। स्थिति में आप व्यू पेजर को अपनी वांछित स्थिति में स्थानांतरित करने के लिए बना सकते हैं।

+0

पता लगाने पर काम नहीं करता है यदि उपयोगकर्ता पहले से ही रीसाइक्लिंग व्यू में शीर्ष स्थान पर है और व्यूअरजर को ट्रिगर करने के लिए भी ऊपर स्क्रॉल करने का प्रयास करता है। –

+0

@AlexanderHoffmann :: ** int topRowVerticalPosition = 0; ** को सार्वजनिक रूप से घोषित करने का प्रयास करें। – Jeevanandhan

+0

मैं चर को ऑनस्कोल विधि के अंदर सार्वजनिक रूप से सेट नहीं कर सकता। वैसे भी यह किसी भी तरह का अर्थ होगा, है ना? –

1

आप RecyclerView से पहुँच VerticalViewPager है, तो आप RecyclerView का विस्तार करने और canScrollVertically(-1) जाँच और आगे स्पर्श घटना viewpager को

1

आप मैं नई इस के लिए लागू है, तो आप नीचे की कोशिश कर सकते है माता पिता scrollview में nestedscroll न करे की जरूरत है सकते हैं लिंक https://github.com/liuxiaocong/VerticalViewpage

0

मैं एक ही समस्या थी। श्री इंडिया का जवाब सहायक था, लेकिन जैसा कि आपने टिप्पणी की, यह कभी-कभी काम करता था।

मैं क्या ACTION_UP गति> 500, इसका मतलब है कि यह एक विचार की गति पर हो रहा है और topRowVerticalPosition यह recyclerview के शीर्ष पर है इसका मतलब है इस बात की पुष्टि पर

recyclerView.setOnTouchListener(new View.OnTouchListener() { 
      public float speed; 
      public VelocityTracker mVelocityTracker; 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       int index = event.getActionIndex(); 
       int action = event.getActionMasked(); 
       int pointerId = event.getPointerId(index); 

       switch (action) { 

        case MotionEvent.ACTION_DOWN: 
         if(mVelocityTracker == null) { 
          mVelocityTracker = VelocityTracker.obtain(); 
         } 
         else { 
          mVelocityTracker.clear(); 
         } 
         mVelocityTracker.addMovement(event); 
         break; 
        case MotionEvent.ACTION_MOVE: 
         if(mVelocityTracker != null) { 
          mVelocityTracker.addMovement(event); 
          mVelocityTracker.computeCurrentVelocity(1000); 
          speed = VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId); 
         } 
         break; 
        case MotionEvent.ACTION_UP: 
         int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop(); 
         if(speed > 500 && topRowVerticalPosition >= 0) { 
          ReaderFragmentParent parent = (ReaderFragmentParent) getActivity(); 
          ReaderPager pager = parent.getPager(); 
          if(pager != null) { 
           pager.setCurrentItem(pager.getCurrentItem()-1); 
          } 

         } 
         return false; 
        case MotionEvent.ACTION_CANCEL: 
         mVelocityTracker.recycle(); 
         break; 
       } 


       return false; 
      } 
     }); 

था। फिर मुझे ViewPager और setCurrentItem पिछले आइटम पर मिलता है।

यह एक गंदा हैक का एक सा है, लेकिन यह एक ही रास्ता मैं कार्यक्षेत्र ViewPager

0
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrolled (RecyclerView recyclerView,int dx, int dy) { 

      } 
      @Override 
      public void onScrollStateChanged (RecyclerView recyclerView,int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 

       if (!mRecyclerView.canScrollVertically(-1) && newState == 0) { 

        Log.e("canScrollVertically", mRecyclerView.canScrollVertically(-1)+""); 

        verticalViewPager.setCurrentItem(0, true); 
       } 
      } 
     });