RecyclerView布局已更改,并且在滚动时会截断值

时间:2016-02-13 04:20:56

标签: android android-layout adapter android-recyclerview

我曾多次处理过RecyclerView次,但这次我将height/width的{​​{1}} items改为RecyclerView。这个实现发生的事情是,每当我滚动wrap_content时,其中的项目的布局和值也会混乱。例如。布局太小而不适合项目的值,因此当我在RecyclerView上向上和向下滚动时,值会被截断。

Recyclerview hiccup!

我知道滚动RecyclerView将不可避免地回收视图,在创建活动时重复使用第一个显示的布局。如果我对这个逻辑错了,请纠正我。

我希望能够为这个问题找到一些解决方案或解决方法,因为我真的很想拥有RecyclerView项目的布局,以便很好地符合这个价值。就像Messenger应用程序一样,卡片视图的大小与其内容相当。我可以在不修复视图大小的情况下实现这一目标吗?

非常感谢!

修改 我会在这里发布代码,如果这可以让您更好地了解我的问题。

  

RecyclerView适配器

RecyclerView
  

chat_item_sender.xml

注意:与chat_item_recipient.xml相同,它们是RecyclerView的项目; chat_item_sender.xml是右侧的橙色视图

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

}
}

3 个答案:

答案 0 :(得分:1)

获取导致问题的视图,对于您的情况,它是包含聊天文本的TextView。对绑定视图进行requestLayout方法调用。

viewHolder.message.requestLayout();

但是请记住在你的textView上调用它,而不是在布局上面用wrap_content调用它!

答案 1 :(得分:0)

我遇到了同样的问题。我知道这在线程中已经很晚了,但如果其他人面临同样的问题,那么我是如何解决它的。

问题在于将textview嵌套在父视图中。虽然回收器视图可以在绑定期间优化内存使用,但它基本上可以从池中提取未经更改并重新使用它的视图。由于父视图未被更改且仅更改了textview,因此它使用池中具有错误宽度的其中一个视图。

因此解决方案是不要在父视图中包装textviews。

希望这有帮助。

答案 2 :(得分:0)

请勿在布局文件中使用android:layout_weight,而无需加重重量即可管理布局。问题将得到解决。