studio recyclerview ejemplo cardview android android-recyclerview nestedscrollview recycling recycle

android - ejemplo - RecyclerView no recicla vistas cuando lo usa dentro de NestedScrollView



cardview android ejemplo (2)

Esto se debe a que tenemos una vista de reciclador que tiene un comportamiento de desplazamiento dentro de una vista de desplazamiento. (desplazarse dentro de un desplazamiento)

Creo que la mejor manera de resolver este problema es en su profileCardview como un encabezado en su vista de reciclador y luego elimine la vista de desplazamiento anidada.

Si se tratara de una vista de lista, entonces era tan simple como listView.addHeaderView (profileCardView) pero para la vista Recycler no hay equivalente de addheadview. Por lo tanto, puede consultar el siguiente enlace para cambiar su implementación.

¿Hay un addHeaderView equivalente para RecyclerView?

Estoy usando RecyclerView dentro de NestedScrollView . También configuré setNestedScrollingEnabled en falso para la vista de recyclerview

para soportar una API más baja

ViewCompat.setNestedScrollingEnabled(mRecyclerView, false);

¡Ahora! Cuando el usuario desplaza la vista, todo parece estar bien, pero !!! las vistas en la vista de reciclaje no se reciclan !!! ¡Y el tamaño del montón crece rápidamente!

Actualización : el administrador de diseño RecyclerView es StaggeredLayoutManager

fragment_profile.xml :

<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:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" > </android.support.design.widget.AppBarLayout> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/profileSwipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- RecyclerView and NestedScrollView --> <include layout="@layout/fragment_profile_details" /> </android.support.v4.widget.SwipeRefreshLayout> </android.support.design.widget.CoordinatorLayout>

fragment_profile_details.xml :

<LinearLayout 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:id="@+id/rootLayout" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:orientation="vertical" > <android.support.v4.widget.NestedScrollView android:id="@+id/nested_scrollbar" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="fill_vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:fillViewport="true" android:scrollbars="none" > <LinearLayout android:id="@+id/nested_scrollbar_linear" android:layout_width="match_parent" android:layout_height="wrap_content" android:descendantFocusability="blocksDescendants" android:orientation="vertical" > <android.support.v7.widget.CardView android:id="@+id/profileCardview" android:layout_width="match_parent" android:layout_height="wrap_content" app:cardBackgroundColor="@color/card_backgroind" app:cardCornerRadius="0dp" app:cardElevation="0dp" > <!-- Profile related stuff like avatar and etc. ---> </android.support.v7.widget.CardView> <android.support.v7.widget.RecyclerView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/four" android:layout_marginEnd="@dimen/four" android:layout_marginLeft="@dimen/four" android:layout_marginRight="@dimen/four" android:layout_marginStart="@dimen/four" android:layout_marginTop="@dimen/four" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:clipToPadding="false" /> </LinearLayout> </android.support.v4.widget.NestedScrollView> </LinearLayout>

ProfileFragment.java :

mAdapter = new MainAdapter(getActivity(), glide, Data); listView = (RecyclerView) view.findViewById(R.id.list_view); ViewCompat.setNestedScrollingEnabled(listView, false); listView.setAdapter(mAdapter); mStaggeredLM = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); mStaggeredLM.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS); listView.setLayoutManager(mStaggeredLM); mScroll.setOnScrollChangeListener(new OnScrollChangeListener() { @Override public void onScrollChange(NestedScrollView arg0, int arg1, int arg2, int arg3, int arg4) { View view = (View) mScroll.getChildAt(mScroll.getChildCount() - 1); int diff = (view.getBottom() - ( mScroll.getHeight() + mScroll.getScrollY())); if(diff == 0){ int visibleItemCount = mStaggeredLM.getChildCount(); int totalItemCount = mStaggeredLM.getItemCount(); int[] lastVisibleItemPositions = mStaggeredLM.findLastVisibleItemPositions(null); int lastVisibleItemPos = getLastVisibleItem(lastVisibleItemPositions); Log.e("getChildCount", String.valueOf(visibleItemCount)); Log.e("getItemCount", String.valueOf(totalItemCount)); Log.e("lastVisibleItemPos", String.valueOf(lastVisibleItemPos)); if ((visibleItemCount + 5) >= totalItemCount) { mLoadMore.setVisibility(View.VISIBLE); Log.e("LOG", "Last Item Reached!"); } mMore = true; mFresh = false; mRefresh = false; getPosts(); } } });

Ps: he configurado cargar más en la vista de desplazamiento, ¡porque la vista del recyclerview hace de forma continua y ninguna se puede detener!

Cualquier ayuda es apreciada


Para un RecyclerView o ListView, la altura debe ser constante, porque si no tendrá un tamaño constante, entonces cómo administrará el número máximo de filas visibles en la memoria. Pruebe cambiando el atributo RecyclerView android:layout_height="match_parent" lugar de "wrap_content" . Debería mejorar la gestión de tu memoria.