2015-11-24 13 views
5

Sto implementando uno RecyclerView all'interno di uno ScrollView. Per avere un solo comportamento di scorrimento sull'intera pagina implemento una versione NonScrollRecyclerView. L'implementazione è la seguente:Problema di scorrimento di Non Scroll RecyclerView nell'SDK Android 23

public class NonScrollRecyclerView extends RecyclerView { 
    public NonScrollRecyclerView(Context context) { super(context); } 

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

    public NonScrollRecyclerView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev){ 

     if(ev.getAction() == MotionEvent.ACTION_MOVE) 
      return true; 

     return super.dispatchTouchEvent(ev); 
    } 
} 

Una volta che aggiorno il mio impostazioni di generazione e di destinazione per SDK 23, ho difficoltà a scorrere la pagina contenente il NonScrollRecyclerView. Il problema specifico è che la pagina scorre OK fino a quando non raggiungo la porzione di visualizzazione del riciclatore e una volta che si scorre su questa vista non riesco più a scorrere, verso l'alto o verso il basso.

I donot affrontare questo problema con SDK 22 e al di sotto

mio xml è la seguente:

XML@layout/rv contiene la vista riciclatore

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/background_gray"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/background_gray" 
    android:orientation="vertical"> 

    <include 
     layout="@layout/row_mall_header" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/cv_mall_header" 
     android:layout_marginTop="8dp"/> 

    <include 
     layout="@layout/row_mall_shops" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/cv_mall_shops" 
     android:layout_marginTop="8dp"/> 

    <include 
     layout="@layout/row_mall_coupons" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/cv_mall_coupons" 
     android:layout_marginTop="8dp"/> 

    <include 
     layout="@layout/rv" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/cv_mall_feeds" 
     android:layout_marginTop="8dp"/> 

    </LinearLayout> 
</ScrollView> 

XML - @ layout/camper

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/background_gray" 
    android:id="@+id/ll_mall_feeds"> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/white" 
    android:paddingTop="6dp" 
    android:paddingBottom="6dp"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/tv_feedcount" 
     android:textColor="@color/semi_theme_blue" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginLeft="12dp" 
     android:layout_centerVertical="true" /> 

</RelativeLayout> 

<com.project.ui.NonScrollRecyclerView 
    android:id="@+id/nrv" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:divider="@android:color/transparent" 
    android:listSelector="@android:color/transparent" /> 

</LinearLayout> 
+2

Perché non usi solo un LinearLayout invece di un RecyclerView? In pratica, stai trasformando un RecyclerView in un LinearLayout, ma con un sovraccarico molto maggiore. –

+0

Concordo con il commento precedente, basta sbarazzarsi di recyclerView e, se lo si considera, non si è più chiesto problemi di layout xml http: // stackoverflow.it/questions/29956014/why-should-we-use-xml-layouts – Nanoc

+0

puoi creare il tuo layout manager lineare in base alle tue esigenze ... controlla questo link https://github.com/serso/android-linear- Layout-manager/blob/master/lib/src/main/java/org/Solovyev/android/views/LLM/LinearLayoutManager.java –

risposta

2

RecyclerView e ListView non sono raccomandati all'interno di una ScrollView perché gli elementi non vengono calcolati durante il rendering di ScrollView. Ciò significa che l'adattatore potrebbe non essere popolato quando viene visualizzato ScrollView e in seguito quando viene notificato a RecyclerView le modifiche ai dati (ad esempio quando si inizializza l'adattatore), non è possibile ricalcolare l'altezza degli elementi.

È davvero un dolore al collo perché devi cercare di calcolare le altezze degli elementi e non è mai preciso, quindi avrai delle discrepanze quando visualizzi un ListView o un RecyclerView all'interno di una ScrollView. Alcuni esempi di come calcolare le altezze degli elementi possono essere controllati here e here.

Il mio consiglio è quello di trasformare il vostro RecyclerView in un LinearLayout e aggiungere elementi di programmazione, in modo da emula il ListView o RecyclerView comportamento:

LinearLayout layout = (LinearLayout) rootView.findViewById(R.id.files); 
layout.removeAllViews(); 

for (int i = 0; i < fileAdapter.getCount(); i++) { 
    final View item = fileAdapter.getView(i, null, null); 
item.setClickable(true); 

    item.setId(i); 

    item.setOnClickListener(new View.OnClickListener() { 
     @Override 
      public void onClick(View v) { 

       fileContentRowPosition = v.getId(); 

     # Your click action here 


    } 
}); 


layout.addView(item); 

} 

Ecco la sua l'XML con la definizione dei file:

<ScrollView 
    android:id="@+id/scrollView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

... 

    <LinearLayout 
     android:id="@+id/files" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="5dp" 
     android:orientation="vertical"> 
    </LinearLayout> 


</ScrollView> 

È possibile controllare l'intero codice java here e l'intero layout here.

D'altra parte, se si vuole ancora continuare con l'implementazione, e per quanto riguarda il problema, è possibile controllare questo articolo su Handling Scrollable Controls in Scrollview

Con i migliori saluti,

1

per un solo scorrimento nella intera pagina è possibile utilizzare NestedScrollView anziché ScrollView e impostare recyclerView.setNestedScrollingEnabled (false);

Problemi correlati