Раньше я использую следующие старые библиотеки поддержки "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
решить проблему.