Я использую ExpandableListView, а дочерняя строка имеет текстовое представление и флажок в нем.
То, что я хочу сделать, - когда пользователь нажимает кнопку, активность определяет, какие элементы "проверены" и что-то делают с этими элементами.
Я прочитал много сообщений о том, как в настоящее время функции ExpandableListView и флажки не работают, и как мне нужно сохранить дополнительную структуру данных, чтобы отслеживать, что было выбрано, а не. В этом сообщении рассматривается эта проблема: ExpandableListView и флажки
Готово! Теперь я могу отслеживать, что было выбрано, и то, что не было выбрано.
Теперь я хочу решить проблему флажков, не отображающих их состояния. Я заметил, что флажки изменяются случайным образом, когда:
Я знаю, что можно обнаружить эти события.
Я хочу знать, есть ли способ установить флажки вручную. Я сначала попробовал
ExpandableListView elv = getExpandableListView();
for(int i = 0; i < elv.getChildCount(); i++) {
CheckBox checkbox = ... somehow get checbox within the list
checkbox.setChecked(checkList.at(i, j));
}
где я и j указывают, какая группа и дети, и checkList отслеживает отмеченные/непроверенные элементы.
Однако я заметил, что значение getChildCount() зависит от того, сколько групп открыто, и не обязательно сообщает мне, какой элемент списка я могу манипулировать.
ExpandableListView был использован, и у кого-то должен был быть способ обойти эту проблему. Есть ли разумное решение? В частности, я ищу способы проверить/снять отметку с соответствующих элементов в списке на onGroupExpand и onConfigurationChange (или аналогичных событиях).
Заранее спасибо!
Проверить следующий образец Адаптер расширяемого списка
/**
* A simple adapter which maintains an ArrayList of photo resource Ids.
* Each photo is displayed as an image. This adapter supports clearing the
* list of photos and adding a new photo.
*
*/
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
// Sample data set. children[i] contains the children (String[]) for groups[i].
private String[] groups = { "People Names", "Dog Names", "Cat Names", "Fish Names" };
private String[][] children = {
{ "Arnold", "Barry", "Chuck", "David" },
{ "Ace", "Bandit", "Cha-Cha", "Deuce" },
{ "Fluffy", "Snuggles" },
{ "Goldy", "Bubbles" }
};
private ArrayList<ArrayList<Boolean>> checkboxStatus = new ArrayList<ArrayList<Boolean>>();
public MyExpandableListAdapter() {
int groupCount = groups.length;
for(int i=0; i<groupCount; i++)
{
int childCount = children[i].length;
ArrayList<Boolean> childStatus = new ArrayList<Boolean>();
for(int j=0; j<childCount; j++) {
childStatus.add(false);
}
checkboxStatus.add(childStatus);
}
}
public Object getChild(int groupPosition, int childPosition) {
return children[groupPosition][childPosition];
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
public int getChildrenCount(int groupPosition) {
return children[groupPosition].length;
}
public TextView getGenericView() {
// Layout parameters for the ExpandableListView
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 64);
TextView textView = new TextView(ExpandableListCheckboxActivity.this);
textView.setLayoutParams(lp);
// Center the text vertically
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
// Set the text starting position
textView.setPadding(36, 0, 0, 0);
return textView;
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
CheckBox chkbox = new CheckBox(ExpandableListCheckboxActivity.this);
chkbox.setTag("" + groupPosition + "," + childPosition);
chkbox.setOnCheckedChangeListener(checkboxListener);
chkbox.setText(children[groupPosition][childPosition]);
chkbox.setChecked(checkboxStatus.get(groupPosition).get(childPosition));
return chkbox;
}
public Object getGroup(int groupPosition) {
return groups[groupPosition];
}
public int getGroupCount() {
return groups.length;
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getGroup(groupPosition).toString());
return textView;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public boolean hasStableIds() {
return true;
}
private OnCheckedChangeListener checkboxListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String positions = buttonView.getTag().toString();
int groupPosition = Integer.valueOf(positions.split(",")[0]);
int childPosition = Integer.valueOf(positions.split(",")[1]);
checkboxStatus.get(groupPosition).set(childPosition, isChecked);
}
};
}
Если вы просто хотите, чтобы он изменился, щелкнув строку:
elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
CheckBox checkbox = (CheckBox) v.findViewById(r.id.yourcheckbox)
checkbox.setChecked(checkList.at(groupPosition, childPosition));
return true;
}
});