2

My Recyclerview - это список сообщений.RecyclerView items wrap_content width

Каждый элемент является линейным расходом с шириной wrap_content.

Проблема заключается в том, что, когда новый элемент вставляется, элемент будет принимать ширину предыдущего элемента, если он больше (что делает его похожим на него есть большой отступы)

Я попытался setRecycable(false) в ViewHolder конструктора, но что вызвало некоторые проблемы, и я хочу использовать другой подход.

Любая помощь приветствуется. Благодаря

EDIT: Layout:

<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; 
    } 
+0

Пожалуйста, добавьте код. – FiN

+0

@FiN отредактировал исходное сообщение – PampaZiya

+0

вы могли бы поделиться шаблонами 'chat_bubble_outgoing' и' chat_bubble_incoming'? – FiN

ответ

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.

+0

Здравствуйте, я попробовал выше. Это вызвало проблему при использовании этого: notifyItemChanged (0); Этот предмет меняется, но его старая копия разворачивается поверх него, плавающая. Weird – PampaZiya

+0

удалить holder.setIsRecyclable (false); и уточните, какие изменения вы обнаружили. –

+0

Без изменений, если setIsRecycable является истинным. Макеты по-прежнему занимают ширину предыдущего элемента – PampaZiya

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; 
     } 
0

Вы можете попробовать это в вашем адаптере

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

может быть, это заставит макет пересчитывать свои размеры

+0

это работа, но потерянная производительность –

 Смежные вопросы

  • Нет связанных вопросов^_^