【问题标题】:expandable listview with custom Child带有自定义子项的可扩展列表视图
【发布时间】:2014-07-27 17:34:49
【问题描述】:

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

喜欢贝娄图片:

【问题讨论】:

  • 是的,如果孩子的索引为 0,则将这些按钮的可见性设置为 visible(通常它们是 gone)。就是这样
  • 您的意思是为所有孩子设置按钮(处于消失模式),但只为第一个孩子设置可见?
  • 没错。在您的子行布局 xml 中,将可见性设置为 GONE。在代码中,仅将第一个子项(具有索引 0)的可见性设置为 View.VISIBLEGONE 没有空间,所以就好像按钮不在布局内一样。直到您将它们更改为可见。

标签: android expandablelistview


【解决方案1】:

编辑:

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

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 种不同类型的视图(第一个视图和其他视图)。这意味着 2 种不同类型的转换视图。
  • 为了强制列表认为有 2 种类型的视图,我们覆盖 getChildTypeCountgetChildType
  • 我们重新使用默认的 ViewHolder 类和填充 2 个可选按钮视图。这些设置仅适用于第一个孩子的视图。

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

EDIT2

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

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

This answer 有一张很好的图片,它解释了视图是如何被重用的。

希望这能稍微澄清一下 :-) 编码愉快!

【讨论】:

  • 可以帮助我如何给孩子充气按钮?我有充气问题。所以坦克斯
  • @saeid 你在使用自定义适配器吗?
  • ok - 我用这个:if(childPosition == 0 && groupPosition==0) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.ex_list_item2, null); } ...但在右孩子(第一个孩子)中没有膨胀
  • 太棒了! ,它很有帮助并且工作正常,但是一个问题!? - 我以前就是这样用的 和你一模一样! - 但没有 getChildTypeCount & getChildType ,因此,我总是收到错误;那么,你能简单地解释一下 getChildType 是否可以让 Perception 起作用吗!? - 坦克
猜你喜欢
  • 2012-04-06
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多