gpt4 book ai didi

android - Android 适配器 getView() 中 2 种布局的动态膨胀

转载 作者:搜寻专家 更新时间:2023-11-01 08:50:56 26 4
gpt4 key购买 nike

我的最终结果是一个简单的聊天气泡样式 ListView。

  1. 我有左右气泡的两个布局文件
  2. 在我的 Adapter 的 getView 中,我会检查一个标志并膨胀所需的布局
  3. 我也在使用 holder 的概念。

    public class Holder {
    TextView userName;
    TextView message;
    CheckBox box;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    Holder holder;
    OneComment coment = getItem(position);

    if (row == null) {
    holder = new Holder();
    if (coment.left) {
    row = inflater.inflate(R.layout.listitem_left_chat, null, false);
    holder.message = (TextView) row.findViewById(R.id.comment);
    holder.box = (CheckBox) row.findViewById(R.id.checkBox1);
    } else {
    row = inflater.inflate(R.layout.listitem_right_chat, null, false);
    holder.message = (TextView) row.findViewById(R.id.comment2);
    holder.box = (CheckBox) row.findViewById(R.id.checkBox2);
    }
    holder.message.setText(coment.comment);
    holder.box.setChecked(coment.left);
    }
    return row;
    }

我得到了想要的结果。我仍然想知道这种方法是否正确。如果不是,哪种方法最好?

最佳答案

适配器可以处理不同的 View 。您应该覆盖两个方法:getViewTypeCount()getItemViewType(int position)。在你的情况下:

private static final int TYPES_COUNT = 2;
private static final int TYPE_LEFT = 0;
private static final int TYPE_RIGHT = 1;

@Override
public int getViewTypeCount() {
return TYPES_COUNT;
}

@Override
public int getItemViewType (int position) {
if (getItem(position).left) {
return TYPE_LEFT;
}
return TYPE_RIGHT;
}

public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
Holder holder;
OneComment coment = getItem(position);

if (row == null) {
holder = new Holder();
if (getItemViewType (position) == TYPE_LEFT) {
row = inflater.inflate(R.layout.listitem_left_chat, null, false);
holder.message = (TextView) row.findViewById(R.id.comment);
holder.box = (CheckBox) row.findViewById(R.id.checkBox1);
} else {
row = inflater.inflate(R.layout.listitem_right_chat, null, false);
holder.message = (TextView) row.findViewById(R.id.comment2);
holder.box = (CheckBox) row.findViewById(R.id.checkBox2);
}

row.setTag(holder);
} else {
holder = (Holder)row.getTag();
}

holder.message.setText(coment.comment);
holder.box.setChecked(coment.left);

return row;
}

public class Holder {
TextView userName;
TextView message;
CheckBox box;
}

更新:

解释:

getItemViewType 应返回一个整数,用于标识将由 getView(int, View, ViewGroup) 为指定项目创建的 View 类型。如果可以在 getView 中将一个 View 转换为另一个 View ,则两个 View 应该返回相同的结果。

getViewTypeCount 应该返回一个整数,其中包含适配器将处理的 View 类型的数量。

在幕后,Android 使用 View 类型来确定应将哪种类型的 View 传递给 getView 方法。您可以将其视为创建多个可重复使用的 View 桶,从而避免每次新列表项可见时膨胀新 View 的惩罚。

当用户向下滚动 ListView 时,框架将回收不再可见的行,并将它们添加到适当的桶中以供重复使用。当一个新的 Header 或 Event 项目进入 View 时,框架将检查这些 View 之一是否已经存在于回收 View 的桶中,如果存在,它将作为 convertView 传递给 getView 方法。

关于android - Android 适配器 getView() 中 2 种布局的动态膨胀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23540520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com