2016-02-13 83 views
3

我已經處理了RecyclerView幾次,但是這次我將RecyclerViewheight/width的設爲wrap_content。這個實現發生的事情是,每當我滾動RecyclerView時,其中的項目的佈局和值也會變得混亂。例如。當我在RecyclerView上滾動和滾動時,佈局太小而不適合項目的值,因此值被截斷。RecyclerView佈局更改,滾動時截斷值

Recyclerview hiccup!

據我所知,滾動RecyclerView將不可避免地回收的意見,再使用被創建的活動,當第一顯示的佈局。如果我對這個邏輯錯誤,請糾正我。

我希望得到一些解決方法或解決方法,因爲我真的很喜歡RecyclerView項目的佈局很好地符合價值。就像Messenger應用程序中的卡片視圖的內容大小一樣。我能否在不修正視圖尺寸的情況下實現這一目標?

非常感謝!

編輯: 我會在這裏發佈代碼,如果這可能會讓您更好地瞭解我的問題。

RecyclerView適配器

public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> { 

private static final String TAG = ChatAdapter.class.getSimpleName(); 

private Context context; 
ArrayList<Conversation> conversations; 
Conversation conversation; 
private static final int TYPE_SENDER = 1; 
private static final int TYPE_RECIPIENT = 2; 

// Pass in the context and users array into the constructor 
public ChatAdapter(Context context, ArrayList<Conversation> conversations) { 
    super(); 
    this.context = context; 
    this.conversations = conversations; 
} 

@Override 
public int getItemViewType(int position) { 
    conversation = conversations.get(position); 
    if (conversation.getIsSender().equals("1")) { 
     return TYPE_SENDER; 
    } else { 
     return TYPE_RECIPIENT; 
    } 
} 

// Create a new ViewHolder to contain our text and image 
@Override 
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) { 
    ViewHolder viewHolder; 
    LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); 

    switch (position) { 
     case TYPE_SENDER: 
      View v1 = inflater.inflate(R.layout.chat_item_sender, viewGroup, false); 
      viewHolder = new ViewHolder(v1); 
      break; 
     case TYPE_RECIPIENT: 
      View v2 = inflater.inflate(R.layout.chat_item_recipient, viewGroup, false); 
      viewHolder = new ViewHolder(v2); 
      break; 
     default: 
      View v = inflater.inflate(R.layout.chat_item_sender, viewGroup, false); 
      viewHolder = new ViewHolder(v); 
    } 
    return viewHolder; 
} 

// Display our text and image at the specified position in the list 
@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 
    conversation = conversations.get(position); 

    // Feed the message, duration, must put in IF statement or data recycled will be buggy! 
    if (!conversation.getMessage().isEmpty()) { 
     viewHolder.message.setText(conversation.getMessage()); 
    } else { 
     viewHolder.message.setTypeface(null, Typeface.ITALIC); 
     viewHolder.message.setText("Message not retrievable at the moment!"); 
    } 

    if (!conversation.getDate().toString().isEmpty()) { 
     viewHolder.duration.setText(DateUtils.getRelativeDateTimeString(context, 
       conversation.getDate().getTime(), 
       DateUtils.SECOND_IN_MILLIS, 
       DateUtils.DAY_IN_MILLIS, 0)); 
    } else { 
     viewHolder.duration.setVisibility(View.GONE); 
    } 
} 

// Get the number of items in the adapter 
@Override 
public int getItemCount() { 
    return conversations.size(); 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 

    public TextView message, duration; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     message = (TextView) itemView.findViewById(R.id.chat_message); 
     duration = (TextView) itemView.findViewById(R.id.chat_duration); 
    } 

} 
} 

chat_item_sender.xml

注:同chat_item_recipient.xml,這些都爲RecyclerView的項目; chat_item_sender.xml在右邊

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="10dp" 
    android:layout_marginTop="10dp" 
    android:gravity="center_vertical" 
    android:orientation="horizontal"> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="fill_parent" 
     android:layout_weight="1"> 

    </LinearLayout> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="fill_parent" 
     android:layout_marginRight="20dp" 
     android:layout_weight="5" 
     android:gravity="right|center_vertical"> 

     <android.support.v7.widget.CardView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      card_view:cardBackgroundColor="@color/primary" 
      card_view:cardCornerRadius="10dp" 
      card_view:cardPreventCornerOverlap="false" 
      card_view:contentPadding="10dp"> 

      <LinearLayout 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:orientation="vertical"> 

       <TextView 
        android:id="@+id/chat_message" 
        android:layout_width="fill_parent" 
        android:layout_height="0dp" 
        android:layout_weight="1" 
        android:textColor="@color/white" 
        android:text="@string/shorter_test" /> 

       <TextView 
        android:id="@+id/chat_duration" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:gravity="bottom|right" 
        android:text="Duration" 
        android:textColor="@color/secondary_white_text" 
        android:textSize="12sp" /> 

      </LinearLayout> 

     </android.support.v7.widget.CardView> 

    </LinearLayout> 

</LinearLayout> 

+0

如果它是一個垂直滾動RecyclerView,你爲什麼不必須設置爲match_parent項目的寬度是多少? –

+0

@DougStevenson如果這個值太短,會不會使視圖佔用佈局中的所有水平空間並留下大量空的空間? –

+0

發佈您的適配器代碼,也許是您遇到麻煩的截圖。 – rothloup

回答

0

我面臨同樣的問題,橙色視圖。我知道這是相當晚的線程,但如果其他人面臨同樣的問題,這裏是我如何解決它。

問題在於嵌套textview與父視圖。儘管回收器視圖在綁定期間優化了內存使用情況,但它基本上從池中取出了未更改並重新使用它的視圖。由於父視圖沒有被改變,只是文本視圖被改變,所以它使用寬度錯誤的池中的一個視圖。

所以解決方案是不要將文字視圖包裝在父視圖中。

希望這會有所幫助。

1

以引起問題的視圖爲例,您的情況是包含聊天文本的TextView。對綁定的視圖進行方法調用requestLayout

viewHolder.message.requestLayout();