Я хочу показать пользователю список всех устройств и всех их подблоков, чтобы выбрать из в 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?
Спасибо. Я на самом деле столкнулся с этим постом в своих исследованиях для другого вопроса, который у меня был с расширяемыми списками. Не указывает ли атрибут focusable на false во всем, что делает его таким, чтобы никто из моих интерактивных представлений больше не работал? У меня также есть эта странная проблема с проверкой флажков случайным образом, но я предполагаю, что это должен быть отдельный пост. – jmease
Настройка атрибута focusable на false позволяет событиям запускаться по всей цепочке. Поэтому, если у вас есть расширенный список и вы хотите управлять событием click или long click в самом действии, вы должны установить этот настраиваемый атрибут в представлениях адаптера. У меня возникла проблема с событиями, которые не доходят до самого списка. AS для флажков, у меня была такая же проблема. Если вы посмотрите в нижней части CheckListItemAdapter.cs в вопросе, вы заметите, что у меня есть 2 класса, которые используются для элементов. Следуйте этому шаблону, чтобы установить флажки. –
Управляя проверенным значением флажка через эти под-классы, это облегчит вашу проблему при случайных флажках, которые будут проверены/сняты. В этот момент он управляется списком данных, а не самим списком. –