【问题标题】:Why is same ListView item reused everytime?为什么每次都重复使用相同的 ListView 项?
【发布时间】:2017-03-09 21:14:29
【问题描述】:

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

【问题讨论】:

  • 你对getItemViewType()的实现是什么?
  • 我正在使用 List> 并且实现是: public int getItemViewType(int i) { return dialog.get(i).second; }
  • 您是否使用调试器跟踪您的代码?你确定getItemViewType() 会返回你期望的结果吗?

标签: java android listview android-adapter


【解决方案1】:

ListView 在可能的情况下重用视图以提高性能。这就是代码中的 convertView 视图的用途。如果 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2018-06-13
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2019-01-06
    相关资源
    最近更新 更多