Android: динамически помечать флажки в ExpandableListView

1

Я использую 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 (или аналогичных событиях).

Заранее спасибо!

  • 0
    Вы хотите установить сам флажок и изменить его состояние или щелкнуть элемент списка (строку) и изменить его состояние?
  • 0
    Я хочу установить / снять флажки каждый раз, когда вид может измениться, или список изменится визуально.
Теги:
expandablelistview
checkbox

2 ответа

7
Лучший ответ

Проверить следующий образец Адаптер расширяемого списка

/**
     * 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);
            }
        };

    }
  • 0
    Спасибо! Я попробую это.
  • 0
    @Kevin Adesara спасибо твой код помог мне ...
Показать ещё 2 комментария
0

Если вы просто хотите, чтобы он изменился, щелкнув строку:

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;
    }
});
  • 0
    Спасибо за ответ. Я ищу что-то, что я могу запустить в onConfigurationChange (или onRotate ... что-то похожее) и onGroupExpand (из расширяемого представления списка), для всех дочерних элементов в списке. Я, однако, уже использую что-то подобное для установки / снятия флажков при выборе элементов.
  • 0
    Вы используете курсоры или массивы для поддержки списка?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню