2017-02-15 134 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

它工作但性能不佳 –