java - 为什么每次都会重复使用同一个 ListView 项目?

标签 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;
}

最佳答案

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/

相关文章:

java - Spring Boot : Map a map from application. yaml 到带有 @Value 注释的映射

java - 更改 ListView 中单个 View 的外观

java - 尝试从 SQL 数据库检索数据到 listview android 时收到空指针异常

java - 条件语句返回 False

java - 对字母和数字的数组列表进行排序

java - Libgdx 加载图集文件时出错

java - 在 firebase 中使用 ids 检索嵌套数据?

Android:从 XML 项中获取属性值

android - 多列 ListView 错误 View

java - JSF 所需的库是什么/在哪里(特别是 javax.faces 的东西)