Как заставить перерисовать listview?

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

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

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

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

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

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

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

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

редактировать

метод " 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);
}

3 ответов


notifyDataSetChanged() безусловно, должен работать на вас. Как вы справляетесь с изменением предпочтений? Если вы просто отдаете предпочтение SharedPreferences, то он никогда не обновляет статическую переменную MyApplication. Можете ли вы опубликовать код, который вы используете для установки предпочтения? Если вы не используете его, установите onPreferenceChangedListener() для предпочтения цвета, чтобы установить эту статическую переменную при ее изменении.


вы должны позвонить notifyDataSetChanged() на ваш адаптер.


Invalidate, invalidateviews, notifyDatasetChanged, ничего не работало для меня! Чтобы просто обновить listview (с помощью cursoradapter), я просто делаю:

cur = db.rawQuery( "SELECT * FROM ssnt WHERE mid = 1000" ); //optional, initial query
adapter.changeCursor(cur); // or swapCursor(), cur is the initial and the only cursor 

но чтобы иметь правильный цвет фона, рисовать, подчеркивать текст, я просто делаю:

cur = db.rawQuery( "SELECT * FROM ssnt WHERE mid = 1000" );
adapter.changeCursor(cur);
list.setAdapter(adapter);    //just like I did oncreate

мне не нравится решение Barak, потому что оно кажется тяжелым и выполняет код, когда он не нужен.