2

Recyclerview는 메시지 목록입니다.RecyclerView items wrap_content width

각 항목은 너비가 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 onBindViewHolder의 끝 라인에 holder.setIsRecyclable(false);를 사용 또한이

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

와 위

@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

일부 코드를 추가하세요 레이아웃을 강제 어댑터

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

이 시도 할 수 도움이 될 수 있습니다. – FiN

+0

@FiN이 원래 게시물 – PampaZiya

+0

을 편집하면'chat_bubble_outgoing' 및'chat_bubble_incoming' 레이아웃을 공유 할 수 있습니까? – FiN

답변

0

업데이트합니다.

+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

당신은 어쩌면이이 크기를 다시 계산

+0

작동하지만 느슨한 성능 –