android - 带有自定义子项的可扩展 ListView

标签 android expandablelistview

是否可以只在可扩展父项的一个子项中添加按钮?

喜欢下面的图片:

enter image description here

最佳答案

编辑:

好的,这就是您可以通过适配器完成此操作的方法:

static class ViewHolder {
    TextView textView;
    Button button1, button2;
}

@Override
public int getChildTypeCount() {
    return 2;
}

@Override
public int getChildType(int groupPosition, int childPosition) {
    if (childPosition == 0)
        return 0;
    else
        return 1;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        holder = new ViewHolder();
        if (childPosition == 0) {
            // 1st view specifics here
            convertView = mInflater.inflate(R.layout.exp_list_child_2, parent, false);
            holder.button1 = (Button) convertView.findViewById(R.id.button1);
            holder.button2 = (Button) convertView.findViewById(R.id.button2);
            holder.button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(mContext, "Some action here", Toast.LENGTH_SHORT).show();
                }
            });

        } else {
            // Other views
            convertView = mInflater.inflate(R.layout.exp_list_child, parent, false);
        }
        holder.textView = (TextView) convertView.findViewById(R.id.childItem);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.textView.setText("Use your data here for other items");

    return convertView;
}

这里有几点需要注意:

  • 列表使用 convertView 重新使用 View ,但现在您有 2 种不同类型的 View (第一种 View 和其他 View )。这意味着 2 种不同类型的 convertView。
  • 为了强制列表认为有两种类型的 View ,我们覆盖了 getChildTypeCountgetChildType
  • 我们重新使用默认的 ViewHolder 类并填充 2 个可选按钮 View 。这些设置仅供第一个 child 观看。

@FrankN.Stein 提供的解决方案也符合条件。我不确定哪一个在性能方面更好(你必须自己测试)。尽管如此,请记住,即使 GONE View 不可见并且不占用布局中的任何空间,它们仍然存在于 View 层次结构和内存中。

EDIT2:

当适配器重新使用 View 时,它必须知道要获取哪个 View 。因此它调用带有子位置的 getChildType 并询问:“这是什么类型”?

如果只有一种类型(默认情况下),则适配器无法区分它们,并且会在不应该使用的地方重新使用您的 1st-child-layout。

This answer有一张漂亮的图片,解释了如何重用 View 。

希望这有点清除它:-)编码愉快!

关于android - 带有自定义子项的可扩展 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24971876/

相关文章:

android - 从 baseadapter 传递项目 id

android - 如何在 Android 上更改相机曝光?

android - 当我展开子行时,可展开 ListView 背景变为白色

java - 如何让我的 ExpandableListView 等待加载,直到填充我的 HashMap?

android - 将MotionEvent转换为位置后,如何确定在可扩展 ListView 中引用了哪个列表项

android - 禁用 ExpandableListView 的折叠

android - TimePicker 工作正常但不是 DatePicker

android - shouldShowRequestPermissionRationale 总是返回 false

java - 如何使用额外选项(如全景)实现相机功能?

android:在可扩展 ListView 中设置指示器的大小