我正在尝试创建一个简单的聊天/消息布局。我的问题是适配器。我想使用两种不同的布局。一个用于传出和一个传入消息。此外,我想使用ViewHolder方法。但是我的实现导致每次getView运行时都会膨胀/重用相同的布局。
任何人都可以向我解释为什么会这样吗?我需要使用两个视图吗?
相关代码如下所示
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int direction = getItemViewType(position);
ViewHolder holder;
if (convertView == null) {
int res = 0;
int resid = 0;
holder = new ViewHolder();
if (direction == DIRECTION_INCOMING) {
holder = new ViewHolder();
res = R.layout.message_l_box;
resid = R.id.left_bubble_text;
}
else {
res = R.layout.message_r_box;
resid = R.id.right_bubble_text;
}
convertView = LayoutInflater.from(mContext).inflate(res, parent, false);
holder.text = (TextView) convertView.findViewById(resid);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(getItem(position).first);
return convertView;
}
// Ensure that find by id is not called every time -> could cause slow scrolling
private class ViewHolder {
TextView text;
}
答案 0 :(得分:1)
ListViews尽可能重用视图以提高性能。这就是代码中的convertView视图的用途。如果Android已经有另一行你滚动它可以重用它,所以它将被传递到你的getView()方法。如果convertView不为null,则代码不会创建新布局。
您可以执行类似的操作,基本上将当前布局方向存储在ViewHolder中,以便您知道是否可以重复使用布局或者必须重新充气。
private class ViewHolder {
TextView text;
int direction;
}
if (convertView == null || ((ViewHolder) convertView.getTag()).direction != direction) {
// same code you have now to layout a new row
holder.direction = direction
} else { // we know the existing view has same direction so it has the correct layout already inflated and we can reuse it
holder = (ViewHolder) convertView.getTag();
}