RecyclerView布局改变,截断后滚动值

问题描述 投票:3回答:2

我已经处理了RecyclerView几次,但这次我做了height/widthitemsRecyclerViewwrap_content。发生了什么事与此实现的是,每当我滚动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>

android android-layout adapter android-recyclerview
2个回答
1
投票

采取这一原因造成的问题,你的情况下,它包含聊天文本TextView的视图。让requestLayout上绑定视图的方法调用。

viewHolder.message.requestLayout();

但记得不要把这个在你的TextView与WRAP_CONTENT它上面的布局!


0
投票

我面临着同样的问题。我知道这是在线程比较晚,但如果其他人在这里面临着同样的问题是,如何我解决它。

问题在于筑巢与父母意见的TextView。虽然回收视图结合时就执行,以优化内存使用,它基本上拿出从没有改变和重新使用它的泳池美景。由于家长的意见没有被改变,只是TextView的改变,它采用的从错误的宽度池中的景色之一。

所以,解决的办法是不要在父视图包住textviews。

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.