To pytanie różni się nieco od innych o podobnym tytule. Nie próbuję aktualizować danych na liście, próbuję zaktualizować wyglądać na z listy.Jak wymusić przerysowanie listview?
Moja aplikacja jest fragmentaryczna przy użyciu biblioteki pomocy technicznej. Mam PreferenceActivity, gdzie pozwalam użytkownikowi ustawić kolory, które chcieliby mieć dla tekstu na liście (adapter odczytuje preferencje i ustawia kolory). Działa to zgodnie z oczekiwaniami w większości przypadków.
Problem, który mam, jest następujący. Kiedy mam listę na ekranie (jest to ListFragment) i wyciągam menu, wybierz Preferencje i dokonaj zmiany w preferencjach kolorów. Po powrocie do listy z PreferenceActivity, nie mogę sprawić, że lista zostanie przerysowana z określonym nowym kolorem.
Jeśli odejdę od listy i wrócę do niej, zostanie ona zregenerowana z nowym kolorem.
Próbuję użyć onResume
, aby wprowadzić zmianę. Kod Obecnie mam (które wydaje się nie robić nic na liście, ale zmienia kolor nagłówka tak jak powinien):
@Override
public void onResume() {
super.onResume();
header.setTextColor(MyApplication.header);
line.setBackgroundColor(MyApplication.header_line);
subheader.setTextColor(MyApplication.header);
getListView().invalidateViews();
}
Próbowałem invalidateViews
i invalidate
. W desperacji próbowałem wywoływać na adapterze notifyDataSetChanged
, mimo że nie zmieniły się same dane. Nic nie działa.
Czy brakuje mi czegoś oczywistego, czy nie ma sposobu, aby to zrobić?
EDIT
„metodą getView` z mojego adaptera:
@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);
}
Cóż ... To wskazało drogę do mojego znalezienia problemu ... i czuję się niesamowicie głupio. Nazwałem "MyApplication.setPreferences". Metodą jest 'MyApplication.setPrefs'. *westchnienie* – Barak