Android 以编程方式展开/折叠组

Android 以编程方式展开/折叠组,android,xamarin.android,expandablelistview,Android,Xamarin.android,Expandablelistview,我想向用户显示一个列表,其中列出了要在可扩展列表视图中选择的所有单元及其所有子单元,用户可以在其中检查要移动的单元。由于ListView中似乎有可单击的视图,因此它不会像自然情况下那样展开和折叠,因此我只允许CheckedChange事件根据groupPosition展开/折叠。但是,当我更改选中一个复选框时,几个或所有组都会响应,而不仅仅是我正在单击的组 equiplistparent.axml <?xml version="1.0" encoding="utf-8"?> <

我想向用户显示一个列表,其中列出了要在可扩展列表视图中选择的所有单元及其所有子单元,用户可以在其中检查要移动的单元。由于ListView中似乎有可单击的视图,因此它不会像自然情况下那样展开和折叠,因此我只允许CheckedChange事件根据groupPosition展开/折叠。但是,当我更改选中一个复选框时,几个或所有组都会响应,而不仅仅是我正在单击的组

equiplistparent.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="35dp"
android:gravity="center_vertical">
<CheckBox
    android:id="@+id/check"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="45dp" />
<TextView
    android:id="@+id/info"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:textSize="20dp"
    android:gravity="left" />
<AutoCompleteTextView
    android:id="@+id/sites"
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:textColor="@android:color/black"
    android:background="@android:color/white"
    android:layout_margin="5dp"
    android:textCursorDrawable="@null"
    android:gravity="center_horizontal"
    android:hint="To Store" />
</LinearLayout>
自定义适配器

class EquipAdapter : BaseExpandableListAdapter
{
    private string[] Parent { get; set; }
    private List<List<CPEquipment>> Child { get; set; }
    private Context _context { get; set; }
    private IListAdapter _adapter { get; set; }
    private ExpandableListView _list { get; set; }

    public EquipAdapter(Context context, List<string> parent, List<List<CPEquipment>> child, IListAdapter adapter, ExpandableListView list)
    {
        _context = context;
        Parent = parent.ToArray();
        Child = child;
        _adapter = adapter;
        _list = list;
    }

    public override Object GetChild(int groupPosition, int childPosition)
    {
        List<CPEquipment> level1 = Child.ElementAt(groupPosition);
        CPEquipment level2 = level1.ElementAt(childPosition);

        return level2.Serial + " " + level2.Model;
    }

    public override long GetChildId(int groupPosition, int childPosition)
    {
        return Convert.ToInt32(groupPosition.ToString(CultureInfo.InvariantCulture) + childPosition.ToString(CultureInfo.InvariantCulture));
    }

    public override int GetChildrenCount(int groupPosition)
    {
        return Child.ElementAt(groupPosition).Count;
    }

    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
    {
        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) _context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Android.Resource.Layout.SimpleExpandableListItem2, null);
        }

        TextView text = (TextView) convertView.FindViewById(Android.Resource.Id.Text2);
        text.Text = GetChild(groupPosition, childPosition).ToString();

        return convertView;
    }

    public override Object GetGroup(int groupPosition)
    {
        return Parent[groupPosition];
    }

    public override long GetGroupId(int groupPosition)
    {
        return groupPosition;
    }

    public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
    {
        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) _context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Resource.Layout.equiplistparent, null);
        }

        TextView info = (TextView) convertView.FindViewById(Resource.Id.info);
        info.Text = GetGroup(groupPosition).ToString();
        AutoCompleteTextView acText = (AutoCompleteTextView) convertView.FindViewById(Resource.Id.sites);
        acText.Adapter = _adapter;

        CheckBox check = (CheckBox) convertView.FindViewById(Resource.Id.check);
        check.CheckedChange += (o, args) =>
                                   {
                                       int currGroup = groupPosition;
                                       if (args.IsChecked)
                                           _list.ExpandGroup(currGroup);
                                       else
                                       {
                                           _list.CollapseGroup(currGroup);
                                       }
                                   };
        return convertView;
    }

    public override bool IsChildSelectable(int groupPosition, int childPosition)
    {
        return true;
    }

    public override int GroupCount
    {
        get { return Parent.Length; }
    }

    public override bool HasStableIds
    {
        get { return true; }
    }

}
我尝试使用来解决这个问题,但它对ListView自然扩展或崩溃的能力没有任何影响


我试着把复选框放在孩子们而不是家长们身上,然后强制所有的组都打开。但是现在如果我选中其中的3个框,另外3个框将随机选中。我知道有一种方法可以在ListView中使用复选框,但它们的行为与我的不一样。这是MonoDroid的问题吗?

我最近自己也经历了这一点,最后我终于让它正常工作了。我把我最初的问题和最终的解决方案贴在了一起,让一切都正常工作。不确定这是否能帮助您解决问题,但这听起来非常接近我遇到的问题,并且使用我的解决方案,我能够使它正常工作。

谢谢。事实上,我在我的研究中偶然发现了这篇文章,因为我有一个关于可扩展列表的问题。将focusable属性设置为false是否会使我的可点击视图不再工作?我仍然存在随机检查复选框的奇怪问题,但我想这需要单独发布一篇文章。将focusable属性设置为false允许事件在整个链上运行。因此,如果您有一个expandablelistview,并且希望管理活动本身中的click或long click事件,那么您应该在适配器视图上设置该focusable属性。我对事件不能一直到listview本身有意见。至于复选框,我也有同样的问题。如果您查看问题中CheckListItemAdapter.cs的底部,您会注意到我有两个类用于这些项。按照该模式修复复选框。通过通过这些子类管理复选框的选中值,这将缓解随机复选框被选中/未选中的问题。在这一点上,它是由数据列表管理的,而不是由listview本身管理的。谢谢,但是当我将布局和它们的视图设置为focusable=false时,就像在您的示例中一样,listview就不再是可扩展的了。我还看到了在GetChildView中删除单击事件的位置。那么,你在哪里重新添加了点击事件呢?这里的情况变得非常模糊,所以我发布了一个新问题,其中包含了关于我现在面临的确切问题的更清晰和最新的信息。