2016-12-21 21 views
6

के साथ काम नहीं किया है मेरे पास एक लेआउट है जहां मेरे पास एक NestedScrollView है जिसमें एक छवि, एकाधिक बटन और रीसायकल व्यू है।पुनर्चक्रण देखें स्क्रॉल ने NestedScrollView

जब मैं कहता हूँ recycleView.smoothScrollToPosition या recycleView.scrollToPosition() यह क्षण में कुछ भी नहीं है। एक पिक्सेल भी स्क्रॉल करने से इंकार कर दिया। अगर मैं NestedScrollView को हटा देता हूं तो यह ठीक काम करता है, लेकिन अगर मैं आस-पास के क्षेत्रों पर स्क्रॉलिंग प्रभाव खो देता हूं।

क्या आप में से कोई भी इससे पहले इस समस्या से मुलाकात करता है?

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context="world.the.rule.com.testtollbarstuff.ScrollingActivity"> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/app_bar" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/app_bar_height" 
    android:fitsSystemWindows="true" 
    android:orientation="vertical" 
    android:theme="@style/AppTheme.AppBarOverlay"> 


    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     app:layout_collapseMode="none" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 


</android.support.design.widget.AppBarLayout> 

<android.support.design.widget.CollapsingToolbarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:fitsSystemWindows="true" 
    app:contentScrim="?attr/colorPrimary" 
    app:layout_scrollFlags="scroll"> 

    <android.support.v4.widget.NestedScrollView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      app:layout_collapseMode="parallax"> 

      <ImageView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:adjustViewBounds="true" 
       android:clickable="true" 
       android:src="@drawable/mock_image" /> 

      <include layout="@layout/content_scrolling" /> 

     </LinearLayout> 
    </android.support.v4.widget.NestedScrollView> 
</android.support.design.widget.CollapsingToolbarLayout> 

+0

मैंने अभी किया, लेकिन अब बिल्कुल प्रभाव पड़ा! – Karoly

+1

आपके 'LinearLayout' में इस संपत्ति को जोड़ें' एंड्रॉइड: descendantFocusability = "blockDescendants" '। – Ironman

+0

'recycleView.post (नया रननेबल() {सार्वजनिक शून्य रन() {recycleView.smoothScrollToPosition (80);});' – Blackbelt

उत्तर

2

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

नीचे के रूप में जब कभी आप चिकनी स्क्रॉल शुरू करने के लिए

appBarLayout.setExpanded(false, /*true if animation required else false*/true); 
recyclerView.smoothScrollToPosition(position); 

अतिरिक्त जानकारी

साथ ही चाहते पंक्तियां जोड़ें, मैं अपने लेआउट में किसी भी RecyclerView नहीं दिख रहा है और संभावना है कि वहाँ आप रखा है कर रहे हैं यह LinearLayout में है जो कि फिर से CollapsingToolbarLayout का हिस्सा है। मुझे बिल्कुल पता नहीं है कि आपने RecyclerView को CollapsingToolbarLayout के हिस्से के रूप में क्यों रखा है। मैं एक लेआउट (सरलीकृत एक) दूंगा जो मैं उपयोग कर रहा हूं।

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.CoordinatorLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.design.widget.AppBarLayout 
      android:id="@+id/app_bar_layout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:expanded="true" 
      app:layout_behavior="com.company.app.custom.CustomRecyclerScrollBehavior"> 

      <android.support.design.widget.CollapsingToolbarLayout 
       android:id="@+id/collapsing_toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       app:contentScrim="?attr/colorPrimary" 
       app:expandedTitleMarginEnd="64dp" 
       app:expandedTitleMarginStart="48dp" 
       app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

       <FrameLayout 
        android:id="@+id/header_frame" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        app:layout_collapseMode="parallax" 
        app:layout_collapseParallaxMultiplier="0.8"> 

        <com.company.app.custom.CustomViewPager 
         android:id="@+id/view_pager" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         app:calculation="height" 
         app:height_ratio="@integer/product_listitem_img_width_ratio" 
         app:width_ratio="@integer/product_listitem_img_height_ratio" /> 

        <com.company.app.custom.CustomImageView 
         android:id="@+id/img_stock_layer" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:adjustViewBounds="true" 
         android:scaleType="fitXY" 
         android:src="@color/transparent_app_black" 
         android:visibility="gone" 
         app:calculation_type="height" 
         app:ratio_height="@integer/product_listitem_img_width_ratio" 
         app:ratio_width="@integer/product_listitem_img_height_ratio" /> 

        <com.inneex.www.customfonts.FontTextView 
         android:id="@+id/lbl_out_of_stock" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_gravity="center" 
         android:text="@string/out_of_stock" 
         android:textColor="?android:attr/textColorPrimaryInverse" 
         android:textSize="13sp" 
         android:visibility="gone" 
         app:customFont="@string/font_ss_semibold" /> 

        <LinearLayout 
         android:id="@+id/ll_page" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_gravity="bottom|center_horizontal" 
         android:orientation="horizontal" 
         android:paddingBottom="@dimen/inspire_detail_oval_margin_bottom" /> 

       </FrameLayout> 

       <android.support.v7.widget.Toolbar 
        android:id="@+id/main_toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="@dimen/toolbar_height" 
        android:background="?attr/colorPrimary" 
        app:layout_anchor="@id/header_frame" 
        app:layout_collapseMode="pin" 
        app:title=""> 

        <LinearLayout 
         android:layout_width="wrap_content" 
         android:layout_height="match_parent" 
         android:orientation="horizontal"> 

         <com.inneex.www.customfonts.FontTextView 
          android:id="@+id/lbl_toolbar_product_name" 
          android:layout_width="0dp" 
          android:layout_height="wrap_content" 
          android:layout_gravity="center" 
          android:layout_weight="1" 
          android:ellipsize="end" 
          android:lines="1" 
          android:maxLines="1" 
          android:minLines="1" 
          android:textColor="?android:attr/textColorPrimary" 
          android:textSize="18sp" 
          app:customFont="@string/font_ss_semibold" /> 

        </LinearLayout> 
       </android.support.v7.widget.Toolbar> 
      </android.support.design.widget.CollapsingToolbarLayout> 

     </android.support.design.widget.AppBarLayout> 

     <ImageView 
      android:id="@+id/img_back" 
      android:layout_width="@dimen/toolbar_height" 
      android:layout_height="@dimen/toolbar_height" 
      android:layout_gravity="top|start" 
      android:scaleType="fitXY" 
      android:src="@drawable/back" 
      app:layout_collapseMode="parallax" /> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler_view" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="@color/white" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

    </android.support.design.widget.CoordinatorLayout> 

    <include 
     layout="@layout/listitem_product_detail_buy_cheap" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/product_detail_button_buy_cheap_height" 
     android:layout_alignParentBottom="true" 
     android:layout_gravity="bottom" /> 

</RelativeLayout> 

FrameLayout आईडी header_frame के साथ बड़ी उपकरण पट्टी जो स्क्रॉल पर पतन होगा के लिए जिम्मेदार है। Toolbar आईडी main_toolbar टूलबार के संक्षिप्त दृश्य के लिए ज़िम्मेदार है। RecyclerView नीचे AppBarLayout है। ImageView बैक बटन के लिए है जो एक बार प्रदर्शित होने पर प्रदर्शित होगा Toolbar प्रदर्शित होता है।

संदर्भ के लिए, स्क्रॉल चिकनी बनाने के लिए मैंने CustomRecyclerScrollBehavior जोड़ा है जिसे मैंने पहले आपके साथ बात की थी। यह वही है

import android.content.Context; 
import android.support.design.widget.AppBarLayout; 
import android.support.design.widget.CoordinatorLayout; 
import android.support.v7.widget.RecyclerView; 
import android.util.AttributeSet; 
import android.view.View; 

import java.lang.ref.WeakReference; 
import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by jimitpatel on 13/12/16. 
*/ 

public class CustomRecyclerScrollBehavior extends AppBarLayout.Behavior { 

    private Map<RecyclerView, RecyclerViewScrollListener> scrollListenerMap = new HashMap<>(); //keep scroll listener map, the custom scroll listener also keep the current scroll Y position. 


    public CustomRecyclerScrollBehavior() { 
    } 

    public CustomRecyclerScrollBehavior(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    /** 
    * 
    * @param coordinatorLayout 
    * @param child The child that attached the behavior (AppBarLayout) 
    * @param target The scrolling target e.g. a recyclerView or NestedScrollView 
    * @param velocityX 
    * @param velocityY 
    * @param consumed The fling should be consumed by the scrolling target or not 
    * @return 
    */ 
    @Override 
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) { 
     if (target instanceof RecyclerView) { 
      final RecyclerView recyclerView = (RecyclerView) target; 
      if (scrollListenerMap.get(recyclerView) == null) { 
       RecyclerViewScrollListener recyclerViewScrollListener = new RecyclerViewScrollListener(coordinatorLayout, child, this); 
       scrollListenerMap.put(recyclerView, recyclerViewScrollListener); 
       recyclerView.addOnScrollListener(recyclerViewScrollListener); 
      } 
      scrollListenerMap.get(recyclerView).setVelocity(velocityY); 
      consumed = scrollListenerMap.get(recyclerView).getScrolledY() > 0; //recyclerView only consume the fling when it's not scrolled to the top 
     } 
     return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed); 
    } 

    private static class RecyclerViewScrollListener extends RecyclerView.OnScrollListener { 
     private int scrolledY; 
     private boolean dragging; 
     private float velocity; 
     private WeakReference<CoordinatorLayout> coordinatorLayoutRef; 
     private WeakReference<AppBarLayout> childRef; 
     private WeakReference<CustomRecyclerScrollBehavior> behaviorWeakReference; 

     public RecyclerViewScrollListener(CoordinatorLayout coordinatorLayout, AppBarLayout child, CustomRecyclerScrollBehavior barBehavior) { 
      coordinatorLayoutRef = new WeakReference<>(coordinatorLayout); 
      childRef = new WeakReference<>(child); 
      behaviorWeakReference = new WeakReference<>(barBehavior); 
     } 

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

     public void setVelocity(float velocity) { 
      this.velocity = velocity; 
     } 

     public int getScrolledY() { 
      return scrolledY; 
     } 

     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      scrolledY += dy; 

      if (scrolledY <= 0 && !dragging && childRef.get() != null && coordinatorLayoutRef.get() != null && behaviorWeakReference.get() != null) { 
       //manually trigger the fling when it's scrolled at the top 
       behaviorWeakReference.get().onNestedFling(coordinatorLayoutRef.get(), childRef.get(), recyclerView, 0, velocity, false); 
      } 
     } 
    } 
} 

इस वर्ग नेस्ट स्क्रॉल में RecyclerView के लिए स्क्रॉल गति को बनाए रखने के लिए प्रयोग किया जाता है है। यह

पर फ़्लिंग बदल दिया गया है आशा है कि यह आपके लिए काम करेगा!

+0

इसे जोड़ने के लिए धन्यवाद, यह मेरे पालतू प्रोजेक्ट पर ठीक काम करता है, मैं अपने उत्पाद प्रोजेक्ट पर लागू कर रहा हूं! – Karoly

0

इस

recycleView.smoothScrollToPosition(80); 

बाद में, नहीं onCreate अंदर विधि या तो उपयोग में देरी धागा या किसी अन्य overide विधि में करते हैं,।

उदाहरण:

 new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
       recycleView.smoothScrollToPosition(80); 
     } 
    }, 150); 
+0

धन्यवाद दोस्त, लेकिन मैंने पहले ही इसे पोस्टस्टेसम में जोड़ने की कोशिश की है। कुछ भी नहीं होता :( – Karoly

+0

उदाहरण के साथ प्रयास करें, इसे काम करना चाहिए, इसे सिक्योरेट में रखें और उदाहरण दें – yanivtwin

0

recyclerview.Because जब scrollview के अंदर recyclerview, इसकी ऊंचाई अपने आइटम की कुल ऊंचाई हो डब्ल्यूएलएल match_parent या wrap_content के बजाय कुछ निश्चित ऊंचाई दें, तो यह पुस्तक को निष्क्रिय कर देगा recyclerview के और केवल nestedscrollview सक्षम करें।

+0

यह समझ में आया, स्क्रॉलिंग टोपीशन अभी ठीक काम करता है, लेकिन मैं आरडब्ल्यू – Karoly

+0

स्क्रॉल नहीं कर सकता क्षमा करें मुझे आपका प्रश्न नहीं मिला –

+0

इस कोड को अपने कोड 'recycleView.setNestedScrollingEnabled (false) से हटा दें; ' –

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