为什么每次都重复使用相同的ListView项?

时间:2017-03-09 21:14:29

标签: java android listview android-adapter

我正在尝试创建一个简单的聊天/消息布局。我的问题是适配器。我想使用两种不同的布局。一个用于传出和一个传入消息。此外,我想使用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;
}

1 个答案:

答案 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();
}
相关问题