RecyclerView条目的宽度使用wrap_content

3
我的Recyclerview是一组消息列表。
每个项目都是一个线性布局,宽度使用 "wrap_content"。
问题在于,当插入新项时,如果比前一个项更大,则该项将采用前一个项的宽度(这使其看起来像具有大填充)。
我尝试在ViewHolder构造函数中使用 "setRecycable(false)",但导致一些问题,我想采用不同的方法。
感激任何帮助。谢谢
编辑:布局:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<include
    android:id="@+id/message_date_layout"
    layout="@layout/time_bubble"/>

<LinearLayout
    android:id="@+id/message_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="4dp"
    android:layout_marginEnd="30dp"
    android:layout_marginLeft="6dp"
    android:layout_marginRight="30dp"
    android:layout_marginStart="6dp"
    android:background="@drawable/background_incoming_chat_bubble"
    android:orientation="vertical"
    android:padding="6dp">
//other views
 </LinearLayout>
</LinearLayout>

创建ViewHolder

  @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ChatMessagesAdapter.ViewHolder viewHolder;
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = null;
        switch (viewType) {
            case OUTGOING:
                v = inflater.inflate(R.layout.chat_bubble_outgoing, parent, false);
                break;
            case INCOMING:
                v = inflater.inflate(R.layout.chat_bubble_incoming, parent, false);
                break;
        }
        viewHolder = new ChatMessagesAdapter.ViewHolder(v);
        return viewHolder;
    }

请添加一些代码。 - sharp
@FiN编辑了原始帖子。 - Roudi
你能分享一下 chat_bubble_outgoingchat_bubble_incoming 的布局吗? - sharp
我只有与传入的布局有问题。就是我在onCreateViewHolder之前发布的那个布局。它基本上就像我发布的那样。ID为“message_container”的LinearLayout表现得很奇怪。我将把代码更新到完整的布局。 - Roudi
@DavidMiguel 嘿,我最终在ViewHolder构造函数中调用super后使用了setIsRecyclable(false)。如果你找到更好的解决方案,请告诉我。 - Roudi
显示剩余2条评论
3个回答

3

你能在你的适配器中尝试一下这个吗?

      @Override
      public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            holder.itemView.requestLayout();
      }

也许这会强制重新计算布局的尺寸。

松散性能是什么意思?这个对我有用。尽管我没有应用到我的ItemView上,而是应用到了ItemView内部的一个视图上。 - Community

0

用以下代码更新您的上述内容

 @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    ChatMessagesAdapter.ViewHolder viewHolder;
    LayoutInflater inflater = LayoutInflater.from(context);
    View v = null;
    switch (viewType) {
        case OUTGOING:
            v = inflater.inflate(R.layout.chat_bubble_outgoing, null, false);
            break;
        case INCOMING:
            v = inflater.inflate(R.layout.chat_bubble_incoming, null, false);
            break;
    }
    viewHolder = new ChatMessagesAdapter.ViewHolder(v);
    return viewHolder;
}

同时,在onBindViewHolder的末尾行中也要使用holder.setIsRecyclable(false);


你好,我尝试了上面的方法。但是在使用以下代码时出现了问题: notifyItemChanged(0); 该项被更改了,但旧版本的它仍然浮动在其上方。很奇怪。 - Roudi
移除 holder.setIsRecyclable(false); 并更新您发现的更改。 - Ankush Bist
当 setIsRecycable 为 true 时,不会有任何更改。布局仍然采用前一个项目的宽度。 - Roudi
你能提供布局图片和XML布局的完整代码吗? - Ankush Bist

0

这可能会对你有所帮助

        @Override
        public int getItemViewType(int position) {
            if (datas.get(position).getType() == Utils.OUTGOING) {
                return Utils.OUTGOING;
            } else {
                return Utils.INCOMING;
            }
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view;
            switch (viewType) {
                case Utils.OUTGOING:
                    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_bubble_outgoing, parent, false);
                    return new OUTGOINGHolder(view);
                case Utils.INCOMING:
                    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_bubble_incoming, parent, false);
                    return new INCOMINGHolder(view);
            }
            return null;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接