5

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

Мое приложение основано на фрагментах, используя библиотеку поддержки. У меня есть 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 на адаптере, даже если не было никаких изменений в самих данных. Ничто не работает.

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

EDIT

«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

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

+1

Ну ... это указывало на то, как я нахожу проблему ... и я чувствую себя невероятно глупо. Я называл «MyApplication.setPreferences». Этот метод является «MyApplication.setPrefs». *вздох* – Barak

1

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

+3

Вы пропустили часть моего сообщения, где я сказал, что я пробовал это, и это не сработало? Просто попробовал еще раз, то же самое. Нет перерисовки просмотров. – Barak

+0

можете ли вы отправить свой метод getView() из адаптера? – Gallal

+0

Вопрос, отредактированный для добавления метода 'getView'. – Barak

0

Invalidate, invalidateviews, notifyDatasetChanged, nothin работал для меня! Чтобы просто обновить 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 Потому что он кажется тяжелым, и выполняет код, когда это не нужно.

Смежные вопросы