为什么 getView 混合我的行?
Why getView mix my rows?
GetView 方法正确设置数据。我检查我的 mMessageList 项目标签并膨胀相应的布局,但在滚动 getView 时混合它们。我该如何解决这个问题?
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if(convertView == null){
viewHolder = new ViewHolder();
if(mMessageList.get(position).getTag() == RespKey.MESSAGE_TAG_CUSTOMER){
convertView = mInflater.inflate(R.layout.message_list_row_customer, null);
viewHolder.messageTextView = (TextView) convertView.findViewById(R.id.userMessageText);
viewHolder.messageImageView = (ImageView) convertView.findViewById(R.id.userMessageIcon);
} else {
convertView = mInflater.inflate(R.layout.message_list_row_driver, null);
viewHolder.messageTextView = (TextView) convertView.findViewById(R.id.driverMessageText);
viewHolder.messageImageView = (ImageView) convertView.findViewById(R.id.driverMessageIcon);
}
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.messageTextView.setText(mMessageList.get(position).getMessage());
return convertView;
}
public static class ViewHolder{
public TextView messageTextView;
public ImageView messageImageView;
}
对于此用例,您必须覆盖 getViewTypeCount
和 getItemViewType
。前者 return 是您需要的不同 convertView
的数量。在您的情况下,它应该是 2。后者 return 是 convertView
的类型。 E.x.
@Override
public int getItemViewType(int position) {
if (mMessageList.get(position).getTag() == RespKey.MESSAGE_TAG_CUSTOMER) {
return 0;
}
return 1;
}
getItemViewType 总是 return 一个介于 0
和 getViewTypeCount - 1
之间的整数。这个非常重要。在内部,此值用于访问 convertView
的数组
GetView 方法正确设置数据。我检查我的 mMessageList 项目标签并膨胀相应的布局,但在滚动 getView 时混合它们。我该如何解决这个问题?
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if(convertView == null){
viewHolder = new ViewHolder();
if(mMessageList.get(position).getTag() == RespKey.MESSAGE_TAG_CUSTOMER){
convertView = mInflater.inflate(R.layout.message_list_row_customer, null);
viewHolder.messageTextView = (TextView) convertView.findViewById(R.id.userMessageText);
viewHolder.messageImageView = (ImageView) convertView.findViewById(R.id.userMessageIcon);
} else {
convertView = mInflater.inflate(R.layout.message_list_row_driver, null);
viewHolder.messageTextView = (TextView) convertView.findViewById(R.id.driverMessageText);
viewHolder.messageImageView = (ImageView) convertView.findViewById(R.id.driverMessageIcon);
}
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.messageTextView.setText(mMessageList.get(position).getMessage());
return convertView;
}
public static class ViewHolder{
public TextView messageTextView;
public ImageView messageImageView;
}
对于此用例,您必须覆盖 getViewTypeCount
和 getItemViewType
。前者 return 是您需要的不同 convertView
的数量。在您的情况下,它应该是 2。后者 return 是 convertView
的类型。 E.x.
@Override
public int getItemViewType(int position) {
if (mMessageList.get(position).getTag() == RespKey.MESSAGE_TAG_CUSTOMER) {
return 0;
}
return 1;
}
getItemViewType 总是 return 一个介于 0
和 getViewTypeCount - 1
之间的整数。这个非常重要。在内部,此值用于访问 convertView