2012-06-29 2 views
0

Я хочу показать пользователю список всех устройств и всех их подблоков, чтобы выбрать из в ExpandableListView, где они могут проверить, какие из них они хотят переместить. Поскольку, казалось бы, наличие интерактивных представлений внутри ListView не позволяет ему расширяться и сворачиваться, как это было бы естественно, я просто хотел бы, чтобы событие CheckedChange расширялось/сворачивалось на основе groupPosition. Но когда я изменяю чек на один CheckBox, несколько или все группы отвечает, а не только в группе, что я щелкая в.Программно развернуть/свернуть Группа

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; } 
    } 

} 

Я попытался обойти эту проблему, используя this suggestion, но это не имело никакого значения в способности ListViews естественным образом развернуть или свернуть.

Я попытался помещать флажки в дочерние элементы вместо родителя и просто заставлял все группы открываться. Но теперь, если я проверю 3 ящика, еще 3 ящика будут проверять себя случайным образом. Я знаю, что есть способ использовать флажки в ListViews, но они не ведут себя так, как ожидалось, в моем. Это проблема с MonoDroid?

ответ

0

Я только недавно прошел через это сам и, наконец, все это правильно работало на моем конце. Я отправил свой первоначальный вопрос here вместе с моим окончательным решением, чтобы все работало правильно. Не уверен, что это поможет вам, но это звучит REAL близко к проблеме, с которой я столкнулся, и используя мое решение, я смог заставить его работать исправно.

+0

Спасибо. Я на самом деле столкнулся с этим постом в своих исследованиях для другого вопроса, который у меня был с расширяемыми списками. Не указывает ли атрибут focusable на false во всем, что делает его таким, чтобы никто из моих интерактивных представлений больше не работал? У меня также есть эта странная проблема с проверкой флажков случайным образом, но я предполагаю, что это должен быть отдельный пост. – jmease

+0

Настройка атрибута focusable на false позволяет событиям запускаться по всей цепочке. Поэтому, если у вас есть расширенный список и вы хотите управлять событием click или long click в самом действии, вы должны установить этот настраиваемый атрибут в представлениях адаптера. У меня возникла проблема с событиями, которые не доходят до самого списка. AS для флажков, у меня была такая же проблема. Если вы посмотрите в нижней части CheckListItemAdapter.cs в вопросе, вы заметите, что у меня есть 2 класса, которые используются для элементов. Следуйте этому шаблону, чтобы установить флажки. –

+0

Управляя проверенным значением флажка через эти под-классы, это облегчит вашу проблему при случайных флажках, которые будут проверены/сняты. В этот момент он управляется списком данных, а не самим списком. –