Как заставить ArrayAdapter перерисовать все его элементы?

У меня есть список элементов в (подклассе) ArrayAdapter, и когда один из элементов в ArrayAdapter изменяется, всем им необходимо обновить свое представление. (Для некоторого контекста это модель оптового ценообразования, при которой чем больше вещей вы покупаете, тем дешевле становится все остальное, и я хочу обновить цену на все, когда вы добавляете что-то в свою корзину)

Читая документацию, я ожидал notifyDataSetChanged() сделать трюк, но он не делает то, что я хочу. Что я должен делать?

В соответствии с просьбой, вот моя функция getView. Метод totalPrice() для orderChoice изменяется в зависимости от того, что еще выбрано.

@Override
public View getView(int position, View convertView, final ViewGroup parent){
    final EditingOrderChoiceAdapter adapter = this;
    View choiceView = convertView;
    if (choiceView == null){
        LayoutInflater choiceViewInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        choiceView = choiceViewInflater.inflate(R.layout.order_choice_row, null);
    }

    final OrderChoice orderChoice = choices.get(position);
    if (orderChoice != null){
        TextView choiceName = (TextView)choiceView.findViewById(R.id.choice_name);
        choiceName.setText(orderChoice.choice.name);

        TextView choicePrice = (TextView)choiceView.findViewById(R.id.choice_price);
        choicePrice.setText(orderChoice.totalPrice().formatted());

        CheckBox choiceCheckBox = (CheckBox)choiceView.findViewById(R.id.choice_checked);
        choiceCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                orderChoice.selected = isChecked;
                adapter.notifyDataSetChanged();
            }
        });
        choiceCheckBox.setChecked(orderChoice.selected);
    }
    return choiceView;
}

person Drew    schedule 07.03.2012    source источник
comment
Вы изменяете данные, на которых основан ваш адаптер (ArrayList, array, cursor)? Возможно, вам следует опубликовать метод getView вашего пользовательского адаптера.   -  person user    schedule 07.03.2012
comment
Я разместил метод getView(). Я не изменяю данные, но возвращаемые значения некоторых методов данных меняются.   -  person Drew    schedule 07.03.2012
comment
Вы уверены, что ваши данные меняются после проверки элемента в списке?   -  person user    schedule 07.03.2012
comment
да. Когда я прокручиваю вниз и снова прокручиваю вверх, представления перезагружаются и отображают новое значение.   -  person Drew    schedule 07.03.2012


Ответы (1)


Вы воссоздаете коллекцию или обновляете элементы в коллекции? Если вы воссоздаете коллекцию, notifyDataSetChanged() не будет работать. Если элементы обновляются, это должно работать.

Если вам действительно нужно уничтожить/воссоздать коллекцию, установите новый адаптер в список.

person Maragues    schedule 07.03.2012
comment
Я не изменяю данные в элементах, но поскольку возвращаемое значение метода в элементах зависит от значений в других элементах, текст, который должен отображаться, отличается. - person Drew; 07.03.2012