Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 具有自定义子级的可扩展listview_Android_Expandablelistview - Fatal编程技术网

Android 具有自定义子级的可扩展listview

Android 具有自定义子级的可扩展listview,android,expandablelistview,Android,Expandablelistview,是否可以只在可扩展父级的一个子级中添加按钮 如下图所示: 编辑: 好的,这是通过适配器实现的方法: static class ViewHolder { TextView textView; Button button1, button2; } @Override public int getChildTypeCount() { return 2; } @Override public int getChildType(int groupPosition, int ch

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

如下图所示:


编辑:

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

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重新使用视图,但现在有两种不同类型的视图(第一视图和其他视图)。这意味着两种不同类型的视图
  • 为了迫使列表认为有两种类型的视图,我们覆盖了
    getChildTypeCount
    getChildType
  • 我们重复使用默认的ViewHolder类,并填充2个可选的按钮视图。这些仅为第一个孩子的视图设置
@FrankN.Stein提供的解决方案也符合条件。我不确定哪一个性能更好(您必须自己测试)。但是,请记住,即使已消失的视图是不可见的,并且不会占用布局中的任何空间,它们仍然存在于视图层次结构和内存中

EDIT2

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

如果只有一种类型(默认情况下),那么适配器将无法区分它们,并将在不应该重复使用第一个子布局的地方重复使用它们

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


希望这有点澄清:-)快乐编码

是,如果子项的索引为0,则将这些按钮的可见性设置为可见(通常它们不存在)。这就是你们的意思,你们的意思是说,设置按钮(在去模式)为所有的孩子,但只是设置为第一个孩子可见?完全正确。在子行布局xml中,将可见性设置为
GONE
。在代码中,将可见性设置为
View.VISIBLE
仅对第一个子级(索引为0)可见<代码>消失了不占用空间,因此按钮好像不在布局中。直到你们把它们变为可见。你们能帮我怎么给孩子充气吗?我有充气的问题。所以Tanx@saeid您正在使用自定义适配器吗?是的,我使用此示例:确定-我使用此示例:if(childPosition==0&&groupPosition==0){LayoutInflater=(LayoutInflater)this.\u context.getSystemService(context.layou\u INFLATER\u SERVICE);convertView=INFLATER.inflate(R.layou.ex\u list\u item2,null);}。。。但不要在正确的孩子(第一个孩子)中膨胀太好了,这很有帮助,而且工作正常,但有个问题!!?-我以前用这种方式跟你一模一样但是没有getChildTypeCount&getChildType,由于这个原因,我总是收到错误;那么,你能解释我getChildType只是为了让它工作的感觉吗黑褐色