Подтвердить что ты не робот

Элемент View Recycler заполняет всю высоту просмотра ресайклера после обновления библиотеки поддержки с "23.1.1" до "23.2.1"

Раньше я использую следующие старые библиотеки поддержки "23.1.1".

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
compile 'com.android.support:preference-v7:23.1.1'
compile 'com.android.support:preference-v14:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'

Это работает очень хорошо. Вот как выглядит мой RecyclerView

введите описание изображения здесь

Теперь я хочу перейти на "23.2.1" из-за некоторых исправлений ошибок.

compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:support-v4:23.2.1'
compile 'com.android.support:preference-v7:23.2.1'
compile 'com.android.support:preference-v14:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.android.support:recyclerview-v7:23.2.1'

Однако внезапно все мои элементы RecyclerView, похоже, заполняют всю высоту RecyclerView.

введите описание изображения здесь

введите описание изображения здесь

Вот фрагмент кода моего файла макета: https://gist.github.com/yccheok/241a0d38d56305a1be24d09b54eb1600

Что действительно озадачивает меня, так это то, что, хотя я использую "wrap_content" в макете просмотра ресайклеров, он работает не так, как ожидалось.

Я не использую какой-либо пользовательский менеджер макетов для моего RecyclerView.

Из http://developer.android.com/tools/support-library/index.html, я понимаю, что 23.2.1 на этот раз делает целый ряд изменений на RecyclerView.

  • Исправлены ошибки, связанные с различными методами измерения. (Выпуск 201856)
  • Уменьшен период блокировки, при котором RecyclerView не позволяет изменять адаптер при расчете макета или прокрутки. (Выпуск 202046)
  • Исправлен сбой при вызове notifyItemChanged() объекта, который не отображается. (Выпуск 202136)
  • Исправлена ​​ошибка, возникающая, когда RecyclerView.LayoutManager добавляет и удаляет представление в одном и том же проходе измерения. (Выпуск 193958)

То, что я подозреваю больше всего, https://code.google.com/p/android/issues/detail?id=201856, так как это связано с изменением различных методов измерения.

До сих пор я пытаюсь воспроизвести проблему с помощью простого проекта RecyclerView с 23.2.1, но не удалось! Он не имеет "item заполняет проблему RecyclerView всей высоты". Я предполагаю, что мой простой проект не моделирует сложную структуру компоновки моего производственного проекта. Мой проект имеет следующий макет

<Activity>
    <Fragment>
        <View Pager>
            <Fragment>
                <RecyclerView />
            </Fragment>
        </View Pager>
    </Fragment>
</Activity>

После отладки в течение нескольких часов я все еще не могу найти основную причину такой проблемы, любой намек?

Спасибо.

Что я пробовал

Я попытался изменить RecyclerView

от

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

к

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

Сначала он выглядит неплохо. Однако, когда вы выполняете прокрутку, вещь не работает должным образом: https://www.youtube.com/watch?v=U2EChFn6WkI

ОБНОВЛЕНИЕ: наконец, я выясню причину возникновения причины

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

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    final List<TransactionSummary> transactionSummaries = buyArray.transactionSummaries;

    if (position == transactionSummaries.size() - 1) {
        holder.itemView.setLayoutParams(lastLayoutParams);
    } else {
        holder.itemView.setLayoutParams(normalLayoutParams);
    }

К сожалению, lastLayoutParams и normalLayoutParams инициализируются как

    normalLayoutParams = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT
    );

    lastLayoutParams = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT
    );

Используя LinearLayout.LayoutParams.WRAP_CONTENT решить проблему.

4b9b3361

Ответ 1

Update

Кажется, что вы обновляете LayoutParam для своего View в своем Adapter.

Это можно сказать, потому что ваш пользовательский интерфейс выглядит абсолютно нормально, пока вы не начнете прокрутку. Это означает, что ваш XML правильный, поскольку он определен в вашем файле макета XML.

Тот факт, что он изменяется после прокрутки, означает, что в вашей реализации onBindViewHolder есть логическая ошибка. Вот почему появляется ошибка при прокрутке вниз, а затем при нажатии на нее появляется ошибка.

Старый ответ

Ваша проблема в том, что ваш разделитель стал изгоем:

<View
    android:layout_width="1px"
    android:layout_height="match_parent"
    android:background="?attr/buyPortfolioSeperatorBackground"
    android:layout_marginRight="5dp"
    android:layout_marginLeft="5dp" />

Для целей тестирования установите для этого значение:

<View
    android:layout_width="1px"
    android:layout_height="30dp"
    android:background="?attr/buyPortfolioSeperatorBackground"
    android:layout_marginRight="5dp"
    android:layout_marginLeft="5dp" />

Убедитесь, что вы изменили оба из них!

Ответ 2

У меня была аналогичная проблема. Это означает, что переработчик не был проблемой. Убедитесь, что ваши измерения элемента CardView переводят на что-то вроде этого:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ...
/>

Если вы не используете CardView, убедитесь, что элемент, который вы используете в своем адаптере для представления, имеет android:layout_height="wrap_content", а не match_parent.

Если это не сработает, вы можете добавить еще один атрибут, устанавливающий minHeight или maxHeight для элемента вида.

Ответ 3

Хорошая новость:

Я могу точно указать вас на точную версию, которая изменила поведение RecyclerView: это не изменение в 23.2.1, а изменение 23.2.0 (февраль 2016 г.), Более конкретно:

RecyclerView.LayoutManager больше не игнорирует некоторые Настройки RecyclerView.LayoutParams, такие как MATCH_PARENT в прокрутке направление.

Примечание. Эти снятые ограничения могут привести к неожиданному поведению в ваших макетах. Убедитесь, что вы указали правильные параметры макета.

Действительно, если вы запускаете библиотеки 23.2.0, вы увидите такое же поведение. Это поведение можно упростить в вашем случае как:

Теперь, когда у вас есть дети RecyclerView с android:layout_x="match_parent", это повлияет на RecyclerView android:layout_x, чего не было в 23.1.1 и более ранних версиях.

Плохая новость:

Даже если я на 99% уверен, что это причина вашей проблемы, я все еще не вижу проблемы в вашем коде. Я фактически создал RecyclerView с вашей структурой XML (изменяя только параметры цвета/фона) с помощью LinearLayoutManager и работает как ожидается в 23.2.1. Я могу поделиться своей реализацией, если вы хотите выполнить проверку работоспособности.

Вам следует дважды проверить реализацию/манипуляцию адаптера, даже если он сильно растянут.

Ответ 4

Для исправления этой ошибки row_layout должен иметь высоту фиксированный или wrap_content! У меня также была эта проблема, и я понял, что высота row_layout была match_parent.

Ответ 5

Высота представления переработчика должна быть только "wrap_content". Если размер ячейки увеличивается, просмотр будет обрабатывать высоту.

buy_portfolio_fragment.xml

 <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/buyPortfolioListViewBackground"
        android:requiresFadingEdge="none"
        android:scrollbars="vertical"
        android:paddingTop="@dimen/default_tab_layout_height"
        android:clipToPadding="false" />

Ответ 6

Я считаю, что это проблема:

<View   android:layout_width="1px"
            android:layout_height="match_parent"    <!--change this to wrap_content-->
            android:background="?attr/buyPortfolioSeperatorBackground"
            android:layout_marginRight="5dp"
            android:layout_marginLeft="5dp" />

В вашем элементе макета есть 2 места, у которых есть layout_height = "match_parent". Вы должны изменить их оба на wrap_content.

Ответ 7

Просто сделайте высоту row_layout до wrap_content поэтому для всех элементов потребуется только фактическое пространство высоты строки.