在 RecyclerView 中使用 If,不显示列表的所有项目

Using If in RecyclerView, doesnt show all the item of the list

我正在尝试为我的聊天应用程序创建一个 RecycleView,并将已发送和到达的消息左右对齐。我使用 if 状态来检查它是否来自我,并且 2 个单独的文本视图与 start/end 对齐并且只显示正确的文本视图。我认为这不是最好的解决方案,因为有时在通知有关新数据的视图后,RecycleView 不会显示所有项目。如果我只是在没有任何 if/gone 等的情况下使用它,列表会显示正确的项目数。

 if (chats.get(position).isFromMe() > 0) {
                holder.txtTextFrMe.setText(chats.get(position).getMessage());
                holder.txtTimeOut.setText(timeForm);
                holder.relIn.setVisibility(View.GONE);
            } else {
                holder.txtText.setText(chats.get(position).getMessage());
                holder.txtTimeIn.setText(timeForm);
                holder.relOut.setVisibility(View.GONE);
            }

和 xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:orientation="vertical"
    android:padding="5dp">


    <RelativeLayout
        android:id="@+id/chatRelIn"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/chatText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:background="@drawable/shape_bg_incoming_bubble"
            android:paddingVertical="10dp"
            android:paddingLeft="30dp"
            android:text="This is a message to me"
            android:paddingRight="10dp"
            android:textSize="17sp" />

        <TextView
            android:id="@+id/chatTextTimeIn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="10.21"
            android:layout_alignBottom="@id/chatText"
            android:layout_marginRight="10dp"
            android:layout_alignParentEnd="true"/>

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/chatRelOut"
        android:layout_marginTop="15dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="right">

        <TextView
            android:id="@+id/chatTextFrMe"
            android:paddingLeft="10dp"
            android:paddingVertical="10dp"
            android:paddingRight="30dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/shape_bg_outgoing_bubble"
            android:textSize="17sp"
            android:layout_alignParentEnd="true"
            android:text="Message from me"
            />

        <TextView
            android:id="@+id/chatTextTimeOut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="10.21"
            android:layout_alignBottom="@id/chatTextFrMe"
            android:layout_alignParentStart="true"
            android:layout_marginRight="10dp"

            />
    </RelativeLayout>
</LinearLayout>

提前致谢!

这主要是因为recyclerview 小部件实际上与缓存一起工作。这就是为什么您应该对用户将看到的内容重复相同的过程,例如 GONE 或 VISIBLE。

if (chats.get(position).isFromMe() > 0) {
            holder.txtTextFrMe.setText(chats.get(position).getMessage());
            holder.txtTimeOut.setText(timeForm);
            holder.relIn.setVisibility(View.GONE);
            holder.relOut.setVisibility(View.VISIBLE);
        } else {
            holder.txtText.setText(chats.get(position).getMessage());
            holder.txtTimeIn.setText(timeForm);
            holder.relIn.setVisibility(View.VISIBLE);
            holder.relOut.setVisibility(View.GONE);
        }