Recyclerview inside scrollview- ¿Cómo desplegar contenido completo?

Tengo Recyclerview dentro de Scrollview

<Scrollview xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <LinearLayout android:id="@+id/layoutStaticContent" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> //Static content. <LinearLayout android:layout_width="match_parent" android:layout_height="100dp"> . . <LinearLayout> //Dynamic content(newsfeed) <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </ScrollView> 

Ahora, mientras se desplaza, layoutStaticContent permanece fijado en la parte superior y el contenido de recyclerview se desplaza independientemente en la parte inferior. ¿Cómo desplazar el contenido completo, es decir, (layoutStaticContent + recyclerview contenido) de tal manera que sólo hay 1 scrollview? También intenté substituir scrollview con Nestedscrollview pero ningún éxito.

    4 Solutions collect form web for “Recyclerview inside scrollview- ¿Cómo desplegar contenido completo?”

    Utilice el android.support.v4.widget.NestedScrollView y luego dentro del diseño NestedScrollView

    Si desea desplazar todos los datos creo que tiene que utilizar CoordinatorLayout. En CoordinatorLayout usas appbar layout y CollapsingToolbarLayout donde puedes poner tu contenido estático. Porque es un enfoque equivocado en Android para utilizar un contenedor de desplazamiento en otro contenedor de desplazamiento. Usted puede utilizar la disposición coordinater como esto.

     <?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" > <android.support.design.widget.AppBarLayout android:id="@+id/app_bar_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" app:contentScrim="?attr/colorPrimary" android:fitsSystemWindows="true" app:expandedTitleMarginStart="48dp" app:expandedTitleMarginEnd="64dp" app:layout_scrollFlags="scroll|exitUntilCollapsed"> //Static content. <LinearLayout android:layout_width="match_parent" android:layout_height="100dp"> . . <LinearLayout> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> 

    Una manera posible alrededor de esto es solamente uso RecyclerView con el contenido estático como encabezado a su Recyclerview.

    Entonces el diseño sería simplemente:

     //Dynamic content(newsfeed) <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> 

    Habrá un layout list_item_header.xml para su contenido estático:

     //Static content. <LinearLayout android:layout_width="match_parent" android:layout_height="100dp"> . . <LinearLayout> 

    Y usted tendrá que cambiar su adaptador de recyclerview para contener:

     private static final int TYPE_HEADER = 0; private static final int TYPE_ITEM = 1; @Override public int getItemCount() { int itemCount = super.getItemCount(); if (mIsHeaderPresent) { itemCount += 1; } return itemCount; } @Override public int getItemViewType(int position) { if (mIsHeaderPresent && position == 0) { return TYPE_HEADER; } return TYPE_ITEM; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_HEADER) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item_header, parent, false); ViewHolderHeader viewHolder = new ViewHolderHeader(itemView); return viewHolder; } else if (viewType == TYPE_ITEM) { return getItemViewHolder(parent); } throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly"); } @Override public void onBindViewHolder(RecyclerView.ViewHolder passedViewHolder) { if (mIsHeaderPresent && passedViewHolder instanceof ViewHolderHeader) { onBindHeaderViewHolder((ViewHolderHeader) passedViewHolder); } else { onBindItemViewHolder(passedViewHolder); } } 

    Después de un montón de buscar y tratar, encontré la solución:

    1. Establezca la altura para el RecyclerView dentro de ScrollView:

      <ScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="wrap_content" android:fillViewport="true"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> ... <android.support.v7.widget.RecyclerView android:id="@+id/myPostsRecyclerView" android:layout_width="match_parent" **android:layout_height="550dp"** android:layout_below="@+id/textView7" android:background="@drawable/background" android:padding="5dp" **android:visibility="gone"** tools:listitem="@layout/item_send" /> </RelativeLayout> </ScrollView> 

    2. En el adaptador, donde se establece la lista de datos:

     public void setData(List<Post> posts) { this.posts.clear(); this.posts.addAll(posts); notifyDataSetChanged(); if (posts.size() < 1) activity.recyclerView.setVisibility(View.GONE); else { activity.recyclerView.setVisibility(View.VISIBLE); ViewGroup.LayoutParams params=activity.recyclerView.getLayoutParams(); params.height=ViewGroup.LayoutParams.WRAP_CONTENT; activity.recyclerView.setLayoutParams(params); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.