RecyclerView не перерабатывает представления при использовании его внутри NestedScrollView

я используюRecyclerView внутриNestedScrollView, Также я установилsetNestedScrollingEnabled ложно дляrecyclerview

поддерживать более низкий API

ViewCompat.setNestedScrollingEnabled(mRecyclerView, false);

Сейчас! Когда пользователь прокручивает вид, все кажется нормальным, но !!! взгляды в утилизаторе не рециркулируются !!! и размер кучи быстро растет !!

Обновить: Менеджер макетов RecyclerViewStaggeredLayoutManager

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: я установил нагрузку больше для просмотра прокрутки, потому чтоrecyclerview делайте это постоянно и никого не остановите!

Любая помощь приветствуется

 MAY3AM09 июн. 2016 г., 12:35
@ Pr38y Я пробовал это раньше и у меня возникли проблемы с производительностью, такой подход может быть приемлем при использованииLinearLayoutManager но в моем случае сStaggeredGridLayoutManager, это не могло помочь так.
 Kevin Robatel25 июл. 2016 г., 16:50
@ MAY3AM вы нашли решение?
 appukrb07 июн. 2016 г., 07:31
@ MAY3AM обновите ваш код и xml
 Wijay Sharma03 янв. 2018 г., 06:47
Привет @ MAY3AM. Есть какое-нибудь решение? У меня есть несколько горизонтальной прокрутки RecyclerView внутри NestedScrollView. Добавили - setNestedScrollingEnabled (true) и столкнулись с той же проблемой (мнение переработчика не является переработкой)
 Khairul Alam Licon09 июн. 2016 г., 04:03
Какую версию переработчика вы собрали в своем Gradle?
 MAY3AM09 июн. 2016 г., 12:14
@ Pr38y Я не хочу обновлять свой адаптер
 MAY3AM25 июл. 2016 г., 22:10
@Kevinrob Нет еще !! :(
 MAY3AM07 июн. 2016 г., 08:13
@appukrb сделано, код и xml добавлены
 Pr38y09 июн. 2016 г., 12:21
NestedScrollView рисует весь дочерний элемент, так что еслиRecyclerView был использован внутриNestedScrollView Все элементы адаптера будут загружены в первый раз. Лучше подход будет использоватьRecyclerView только и использоватьgetItmeViewType возвращатьcardView if(position==0) вadapter, как предложено Реханом.
 MAY3AM13 янв. 2018 г., 06:00
@WijaySharma Привет, к сожалению, у меня ничего нет :(
 MAY3AM05 июн. 2016 г., 10:17
 natario12 июн. 2016 г., 23:40
Примечание: не используйтеViewCompat использоватьRecyclerView#setNestedScrollingEnabled, RecyclerView поставляется из библиотек поддержки и уже передает свои функциональные возможности более старым API.
 rom4ek05 июн. 2016 г., 09:27
Можете ли вы объяснить причину, почему вы добавилиRecyclerView внутриNestedScrollView?
 Pr38y09 июн. 2016 г., 10:46
@ MAY3AM вы пробовали решение, предложенное Rehan дляstackoverflow.com/questions/37437161/... ?
 Tin Tran11 июн. 2016 г., 11:34
Я обычно иду с @ Pr38y. с какой проблемой производительности вы сталкиваетесь?

Ответы на вопрос(2)

потому что если он не будет иметь постоянный размер, то как он будет управлять максимальным количеством видимых строк в памяти. Попробуйте, изменив атрибут RecyclerViewandroid:layout_height="match_parent" вместо"wrap_content", Это должно улучшить управление вашей памятью.

 Clive Jefferies07 нояб. 2018 г., 17:13
Почему это улучшает управление памятью?
 Arturs Vancans08 мар. 2019 г., 14:52
@CliveJefferies Установка layout_height на фиксированный размер уменьшит повторное рисование при обновлении вложенного представления. Вы как бы говорите: «Не волнуйтесь - не нужно перерисовывать это представление, если мои подпредставления меняются, потому что оно имеет фиксированный размер». Теоретически можно сказать, что это может уменьшить объем памяти, но в основном это устранит сборку мусора, блокирующую пользовательский интерфейс, что сделает ваше приложение более плавным.

что у нас есть представление переработчика, которое имеет прокрутку внутри представления прокрутки. (прокрутка внутри прокрутки)

Я думаю, что лучший способ решить эту проблему для васprofileCardview в качестве заголовка в представлении переработчика, а затем удалите вложенное представление прокрутки.

Если бы это был просмотр списка, то это было бы так же просто, как listView.addHeaderView (profileCardView), но для представления Recycler не существует эквивалента addheadview. Следовательно, вы можете обратиться по ссылке ниже, чтобы изменить свою реализацию.

Есть ли аналог addHeaderView для RecyclerView?

 orium15 дек. 2016 г., 08:20
Что делать, если мой переработчик внутри ViewPager. Я не могу использовать заголовок тогда ..

Ваш ответ на вопрос