我正在尝试创建一个简单的聊天/消息布局。我的问题出在适配器上。我想使用两种不同的布局。一根用于传出消息,一根用于传入消息。此外,我想使用 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;
}
最佳答案
ListViews 在可能的情况下重用 View 以提高性能。这就是代码中的convertView View 的用途。如果 Android 已经有另一行您滚动离开的行,则可以重用它,以便将其传递到您的 getView() 方法中。如果convertView不为空,您的代码不会创建新布局。
你可以做这样的事情,基本上将当前布局方向存储在 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();
}
关于java - 为什么每次都会重复使用同一个 ListView 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42705529/