RecyclerView does not recycle views when using it inside NestedScrollView

I am using RecyclerView inside NestedScrollView . I also set setNestedScrollingEnabled to false for RecyclerView

to support lower API

ViewCompat.setNestedScrollingEnabled(mRecyclerView, false);

Now! When the user scrolls the view, everything seems fine, but !!! Views in recyclerview are not processed !!! and heap size is growing fast!

Update : RecyclerView StaggeredLayoutManager Manager 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: I set the load more to scroll because RecyclerView does this continuously and no one stops!

Any help is appreciated.

+44
android recycling android-recyclerview
Jun 02 '16 at 11:33
source share
2 answers

This is because we have a recycler view that has scroll behavior inside the scroll. (scroll inside scroll)

I think the best way to solve this problem is to have your profileCardview as the title in the recycler view and then remove the nested scroll view.

If it was a list, then it was as simple as listView.addHeaderView (profileCardView), but there is no addheadview equivalent to viewing Recycler. Therefore, you can link to the link below to change your implementation.

Is there an equivalent addHeaderView for a RecyclerView?

+6
Jun 10 '16 at 11:28
source share

For a RecyclerView or ListView, the height must be constant, because if it does not have a constant size, then how will it control the maximum number of visible lines in memory. Try changing the RecyclerView android:layout_height="match_parent" attribute android:layout_height="match_parent" instead of "wrap_content" . This should improve memory management.

+2
Jun 19 '16 at 9:45
source share



All Articles