2012-10-12 10 views
30

Zawsze używam wzoru ViewHolder w moich niestandardowych klasach ArrayAdapter. Jednak w CursorAdapter metoda nie jest obowiązkowa, aby była nadpisana, ale ma metody bindView i newView.Android - Czy wzorzec ViewHolder jest automatycznie implementowany w CursorAdapter?

Moje pytanie brzmi - czy CursorAdapter ponownie wykorzystuje widoki, wewnętrznie wdrażając wzór ViewHolder, czy też musi być zakodowany tak, jak zwykle robimy w niestandardowym ArrayAdapter? Jeśli trzeba go zakodować, jaki jest właściwy sposób?

Aktualizacja

Używam android.support.v4.widget.CursorAdapter

Odpowiedz

39

Moje pytanie brzmi - czy CursorAdapter ponownie wykorzystuje widoki, których autorem jest wewnętrznie wdrożenia wzoru ViewHolder czy to musi być zakodowany jako normalnie zrobić w niestandardowym ArrayAdapter?

Nie jestem pewien, do czego odnosi się wzór ViewHolder. Jeśli chodzi o posiadanie klasy pomocniczej do buforowania w celu wyświetlenia widoku za każdym razem (i ustawienie go jako znacznika dla wiersza View), wówczas odpowiedź brzmi "nie". Jeśli chcesz zaimplementować ten wzorzec, musisz skonfigurować uchwyt (poszukaj widoków w widoku wiersza za pomocą findViewById) w metodzie newView, a następnie ustawić go jako znacznik widoku wiersza. Następnie w metodzie bindView możesz zadzwonić pod numer getTag, pobrać uchwyt i użyć go. Przykład:

// custom CursorAdapter ... 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View rowView = ((LayoutInflater) context 
       .getSystemService("layout_inflater")).inflate(
       R.layout.row_layout, parent, false); 
     ViewHolder holder = new ViewHolder(); 
     holder.v1 = rowView.findViewById(R.id.v1); 
     holder.v2 = rowView.findViewById(R.id.v2); 
     rowView.setTag(holder); 
     return rowView; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     // use the holder filled with views 
     // hlder.v1.setSomething 
    } 

    class ViewHolder { 
     View v1, v2; 
    } 
// ... 

Jeśli odnosimy się do convertView ponownego użycia (jak w niewyspecjalizowanych Cursor adapterów opartych) to odpowiedź brzmi tak, metoda getView realizuje ten schemat, wystarczy wdrożyć metody newView i bindView i masz gwarancję uzyskania widoku, który został poddany recyklingowi (jeśli to możliwe w tym momencie).

+0

Przez 'ViewHolder' mam na myśli wzorzec' Holder' ... –

+0

@Mahendra Więc to był pierwszy przypadek. Nie, wzorzec właściciela nie jest zaimplementowany w 'CursorAdapter' (z pakietu SDK lub pakietu kompatybilności). – Luksprog

+0

Moje zapytanie dotyczy raczej "kodowania" posiadacza "w niestandardowej karcie lub czy nie jest wymagane? Widzę, że klasa 'CursorAdapter' również ma metodę' getView' .. –

Powiązane problemy