Максимальная ширина элемента повторного просмотра изменяется из-за большого количества элементов

#java #android #android-recyclerview

Вопрос:

Поэтому я создаю приложение для чата. Раньше я RecyclerView показывал сообщения и устанавливал maxWidth , чтобы элементы списка сообщений составляли 75% ширины устройства, а в макете указывалась ширина 0dp , ConstraintLayout чтобы сделать его динамичным. Это делает его кратким для небольших текстов, а когда текст намного длиннее, он просто отправляет его на следующую строку после достижения максимальной ширины. Все работает отлично до тех пор, пока список товаров не увеличится. Когда данных много, RecyclerView делает ширину такой же, как у предыдущего элемента списка (я знаю RecyclerView , что перерабатывает представления). Одним из решений этого было в том, чтобы setIsRecyclable(false); в том ViewHolder Adapter . Это действительно сработало, но элементы списка перекрывают друг друга, или когда данные одного элемента списка изменяются, он перекрывается, создавая другой элемент сам по себе в качестве измененного элемента. Поскольку он не перерабатывает представления, он создает новые представления для себя после любых изменений в элементе списка. Я не знаю, что мне делать. Должен ли я прибегнуть к ListView этому вместо этого? Или есть какое-то другое решение? Вот мой код для контекста.

ViewHolder установка maxWidth

 public ChatViewHolder(@NonNull @NotNull View itemView, int width) {
    super(itemView);
    ...
    ...
   
    sendContainer.setMaxWidth(width);
    comeContainer.setMaxWidth(width);
}
 

onCreateViewHolder вычисление maxWidth

     @Override
    public ChatViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.message_list_item, parent, false);
        int width = (int) (parent.getWidth() * 0.75);
        return new ChatViewHolder(view, width);
    }
 

Ответ №1:

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

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimaryBackground">

    <TextView
        android:id="@ id/tvMsgSelf"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="24dp"
        android:background="@drawable/drawable_chat_self"
        android:paddingStart="12dp"
        android:paddingTop="16dp"
        android:paddingEnd="12dp"
        android:paddingBottom="16dp"
        android:textSize="14sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_max="wrap"
        app:layout_constraintWidth_percent="0.72"
        tools:text="dgdgdgdgdfddg dfgdf gdf gdf gdf gdf gdfd g dg dfg dfg df gd gdf gdf g dfg dfg dfg dfg df g dfg df g dfgdfg" />

    <TextView
        android:id="@ id/tvTimeStampSelf"
        style="@style/StyleRegular"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:textColor="@color/colorSecondaryText"
        android:textSize="12sp"
        app:layout_constraintEnd_toEndOf="@ id/tvMsgSelf"
        app:layout_constraintTop_toBottomOf="@ id/tvMsgSelf"
        tools:text="2 Jan,20, 10:50PM" />

</androidx.constraintlayout.widget.ConstraintLayout>
 

Основными свойствами здесь являются app:layout_constraintWidth_percent="0.72" и app:layout_constraintWidth_max="wrap" . Это ограничивает ширину этого экрана до 72% от любого заданного экрана, с этого момента он сворачивается вниз.

Комментарии:

1. Я действительно понимаю это. Я сказал, что это действительно работает. Но RecyclerView повторяет взгляды. Поэтому, когда элементов списка много, ширина иногда становится 75% для всех, вместо того, чтобы оборачиваться. Вступайте в силу при перезапуске приложения. Это снова показывает все идеально.

2. Он перерабатывает и использует ширину предыдущего элемента, которая была полной на 75%, и использует эту ширину, чтобы сделать еще меньший текст шириной 75%

3. Я не знаю, что и знать

4. Я говорю, что вам даже не нужно беспокоиться обо всем этом. Просто создайте свой макет так, как я упоминал выше, и он автоматически подстроится под 75% экрана. Вам вообще не нужно вносить какие-либо изменения в ViewHolder. Вы можете настроить все это в самом макете ограничений @SimranSharma

5. Я это сделал. Но так как он перерабатывает представления, при прокрутке быстро меняется ширина. Когда вы перезапускаете, все возвращается к идеальному состоянию, как я и хочу, но снова после прокрутки меняется ширина