具有自定义Child的可扩展列表视图

时间:2014-07-26 14:10:02

标签: android expandablelistview

可以在可扩展父级的一个子级中添加Button吗?

像贝娄图像一样:

enter image description here

1 个答案:

答案 0 :(得分:2)

编辑:

好的,这是通过适配器实现此目的的方法:

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重新使用视图,但现在您有2种不同类型的视图(第一个视图和其他视图)。这意味着有两种不同类型的convertViews。
  • 要强制列表认为有两种类型的观看,我们会覆盖getChildTypeCountgetChildType
  • 我们重新使用默认的ViewHolder类和cram 2可选按钮视图。这些仅适用于第一个孩子的视图。

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

<强> EDIT2

当适配器重新使用视图时,它必须知道要获取哪个视图。所以它会调用getChildType与孩子的位置并问:&#34;这是什么类型&#34;?

如果只有一种类型(默认情况下是这样),则适配器无法区分它们,并且会在不应该使用第一个子布局的地方重新使用第一个子布局。是的。

This answer有一张很好的图片,解释了视图的重复使用方式。

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