2012-06-20 11 views
5

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); 
} 

Odpowiedz

7

notifyDataSetChanged() powinien z pewnością działać dla Ciebie. Jak radzisz sobie ze zmianą preferencji? Jeśli właśnie zatwierdzasz opcję SharedPreferences, to nigdy nie aktualizujesz statycznej zmiennej MyApplication. Czy możesz wpisać kod, którego używasz do ustawienia preferencji? Jeśli go nie używasz, ustaw wartość onPreferenceChangedListener() dla ustawienia koloru, aby ustawić tę zmienną statyczną podczas jej zmiany.

+1

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

1

Należy zadzwonić notifyDataSetChanged() na adapterze.

+3

Czy spóźniłeś się z częścią w moim poście, w której powiedziałem, że próbowałem i nie zadziałało? Wypróbowałem to jeszcze raz, to samo. Bez przerysowywania widoków. – Barak

+0

można opublikować metodę getView() z adaptera? – Gallal

+0

Pytanie edytowane w celu dodania metody 'getView'. – Barak

0

Invalidate, invalidateviews, notifyDatasetChanged, nothin pracował dla mnie! po prostu zaktualizować ListView (z CursorAdapter) Ja po prostu zrobić:

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 

Ale aby mieć prawidłowy Tła kolor, odkształcalne, podkreślenie tekstu, po prostu zrobić:

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

I dont like rozwiązania Barak ponieważ wydaje się ciężki i wykonuje kod, gdy nie jest potrzebny.