2017-02-15 170 views
2

我的Recyclerview是一个消息列表。RecyclerView项目wrap_content宽度

每个项目是一个线性布局,宽度为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> 

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); 这个项目变成了变化,但是它的旧副本在它上面显示,是浮动的。怪异 – PampaZiya

+0

remove holder.setIsRecyclable(false);并更新您找到的更改。 –

+0

setIsRecycable为true时不会更改。布局仍然采用前一项 – 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

它工作但性能不佳 –