3

我的 Recyclerview 是一个消息列表。

每个项目都是一个有wrap_content宽度的线性布局。

问题是当插入一个新项目时,如果它更大,该项目将采用前一个项目的宽度(这使它看起来有一个大的填充)

setRecycable(false)在 ViewHolder 构造函数中尝试过,但这导致了一些问题,我想使用不同的方法。

任何帮助表示赞赏。谢谢

编辑:布局:

<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>

CraeteViewHolder

  @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;
    }
4

3 回答 3

2

你能在你的适配器中试试这个吗

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

也许这会迫使布局重新计算其尺寸

于 2017-02-15T10:59:11.433 回答
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;
        }
于 2017-02-15T10:52:33.077 回答
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;
}

并且还使用holder.setIsRecyclable(false);.onBindViewHolder

于 2017-02-15T10:43:29.947 回答