我已經處理了RecyclerView
幾次,但是這次我將RecyclerView
的height/width
的設爲wrap_content
。這個實現發生的事情是,每當我滾動RecyclerView
時,其中的項目的佈局和值也會變得混亂。例如。當我在RecyclerView
上滾動和滾動時,佈局太小而不適合項目的值,因此值被截斷。RecyclerView佈局更改,滾動時截斷值
據我所知,滾動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>
如果它是一個垂直滾動RecyclerView,你爲什麼不必須設置爲match_parent項目的寬度是多少? –
@DougStevenson如果這個值太短,會不會使視圖佔用佈局中的所有水平空間並留下大量空的空間? –
發佈您的適配器代碼,也許是您遇到麻煩的截圖。 – rothloup