我曾多次处理过RecyclerView
次,但这次我将height/width
的{{1}} items
改为RecyclerView
。这个实现发生的事情是,每当我滚动wrap_content
时,其中的项目的布局和值也会混乱。例如。布局太小而不适合项目的值,因此当我在RecyclerView
上向上和向下滚动时,值会被截断。
我知道滚动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);
}
}
}
答案 0 :(得分:1)
获取导致问题的视图,对于您的情况,它是包含聊天文本的TextView。对绑定视图进行requestLayout
方法调用。
viewHolder.message.requestLayout();
但是请记住在你的textView上调用它,而不是在布局上面用wrap_content调用它!
答案 1 :(得分:0)
我遇到了同样的问题。我知道这在线程中已经很晚了,但如果其他人面临同样的问题,那么我是如何解决它的。
问题在于将textview嵌套在父视图中。虽然回收器视图可以在绑定期间优化内存使用,但它基本上可以从池中提取未经更改并重新使用它的视图。由于父视图未被更改且仅更改了textview,因此它使用池中具有错误宽度的其中一个视图。
因此解决方案是不要在父视图中包装textviews。
希望这有帮助。
答案 2 :(得分:0)
请勿在布局文件中使用android:layout_weight
,而无需加重重量即可管理布局。问题将得到解决。