Как принудительно перерисовать список?

Этот вопрос немного отличается от других с аналогичным названием. Я не пытаюсь обновить данные в списке, я пытаюсь обновить внешний вид списка.

Мое приложение основано на фрагментах с использованием библиотеки поддержки. У меня есть PreferenceActivity, где я разрешаю пользователю устанавливать цвета, которые они хотели бы для текста в списке (, адаптер считывает предпочтение и устанавливает цвета ). Это работает, как и ожидалось по большей части.

Проблема у меня следующая. Когда у меня есть список на экране (, это ListFragment )и откройте меню, выберите «Настройки» и измените настройки цвета. По возвращении в список из PreferenceActivity я не могу заставить список перерисовываться с указанным новым цветом.

Если я уйду из списка и вернусь к нему, он будет регенерирован с новым цветом.

Я пытаюсь использовать onResume, чтобы внести изменения. Код, который у меня есть в настоящее время (, который, кажется, ничего не делает со списком, но меняет цвет заголовка, как и должно):

@Override
public void onResume() {
    super.onResume();
    header.setTextColor(MyApplication.header);
    line.setBackgroundColor(MyApplication.header_line);
    subheader.setTextColor(MyApplication.header);
    getListView().invalidateViews();
}

Я пробовал invalidateViewsи invalidate. В отчаянии я попытался вызвать notifyDataSetChangedна адаптере, хотя сами данные не изменились. Кажется, ничего не работает.

Я пропустил что-то очевидное, или нет никакого способа сделать это?

РЕДАКТИРОВАТЬ

Метод getView `из моего адаптера:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null)
        convertView = View.inflate(context, layout, null);
    View row = convertView;
    c.moveToPosition(position);
    TextView first = (TextView) convertView.findViewById(R.id.ListItem1);
    TextView second = (TextView) convertView.findViewById(R.id.ListItem2);
    TextView third = (TextView) convertView.findViewById(R.id.ListItem3);
    TextView fourth = (TextView) convertView.findViewById(R.id.ListItem4);

    DecimalFormat df = new DecimalFormat("0.00");
    Double hold = Double.valueOf(c.getString(3));
    Double qty = Double.valueOf(c.getString(1));
    Double total = hold * qty;

    String color = "#FF00FF";
    first.setText(c.getString(2));
    first.setTextColor(MyApplication.shoplistitem_name);
    second.setText(c.getString(4));
    second.setTextColor(MyApplication.shoplistitem_desc);
    third.setText(c.getString(1));
    third.setTextColor(MyApplication.shoplistitem_qty);
    fourth.setText("$" + df.format(total));
    fourth.setTextColor(MyApplication.shoplistitem_desc);

    if (strikethroughState[position] == 1) {
        first.setPaintFlags(first.getPaintFlags()
                | Paint.STRIKE_THRU_TEXT_FLAG);
        second.setPaintFlags(second.getPaintFlags()
                | Paint.STRIKE_THRU_TEXT_FLAG);
        third.setPaintFlags(third.getPaintFlags()
                | Paint.STRIKE_THRU_TEXT_FLAG);
        fourth.setPaintFlags(third.getPaintFlags()
                | Paint.STRIKE_THRU_TEXT_FLAG);
        row.setBackgroundColor(MyApplication.shoplistitem_checked);
    } else {
        first.setPaintFlags(first.getPaintFlags()
                & ~Paint.STRIKE_THRU_TEXT_FLAG);
        second.setPaintFlags(second.getPaintFlags()
                & ~Paint.STRIKE_THRU_TEXT_FLAG);
        third.setPaintFlags(third.getPaintFlags()
                & ~Paint.STRIKE_THRU_TEXT_FLAG);
        fourth.setPaintFlags(third.getPaintFlags()
                & ~Paint.STRIKE_THRU_TEXT_FLAG);
        row.setBackgroundResource(R.color.black);
    }
    return (row);
}
7
задан Barak 20 June 2012 в 16:24
поделиться