scrolling recyclerview not inside ejemplo android android-recyclerview nestedscrollview

android - not - Recyclerview dentro de scrollview- ¿Cómo desplazar todo el contenido?



scroll recyclerview (4)

Una posible forma de evitar esto es usar RecyclerView con el contenido estático como encabezado para 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 diseño de list_item_header.xml para su contenido estático:

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

Y tendrá que cambiar su adaptador de recyclerview para que contenga:

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); } }

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 se mantiene fijo en la parte superior y el contenido de la vista recyclerview se desplaza de forma independiente en la parte inferior. ¿Cómo desplazar todo el contenido, por ejemplo, (layoutStaticContent + recyclerview content) de modo que solo haya 1 scrollview? También traté de reemplazar scrollview con Nestedscrollview pero no tuve éxito.



si desea desplazar todos los datos, creo que debe usar CoordinatorLayout. en CoordinatorLayout, utiliza el diseño de la barra de herramientas y CollapsingToolbarLayout, donde puede colocar su contenido estático. porque es un enfoque incorrecto en Android para usar un contenedor capaz de desplazarse a otro contenedor capaz de desplazarse. puede usar un diseño de coordinadores como este.

<?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>


Después de muchas búsquedas e intentos, encontré la solución:

1. Establezca la altura de 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 configura 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); } }