2010-08-20 12 views

Odpowiedz

72

CursorAdapter ma implementację getView() że delegatów na newView() i bindView() w taki sposób, wymusza wzór recyklingu rząd. Dlatego nie musisz robić nic specjalnego z CursorAdapter dla recyklingu rzędów, jeśli nadpisujesz newView() i bindView().

+6

Jak zastosować wzór ViewHolder? Czy podzieliłbym go między newView() i bindView()? –

+17

@Scienceprodigy: W 'newView()' utworzysz 'ViewHolder' dla wiersza i powiążesz go z' setTag() '. W 'bindView()' pobierałbyś 'ViewHolder' przez' getTag() '. – CommonsWare

+0

Dzięki, że działa. Mam jednak problem z recyklingiem widoków, ponieważ mam pozycje listy, które mają domyślnie nagłówek GONE, którego używam do wyświetlania datowanych sekcji. Wszystko wygląda dobrze, dopóki nie rzucam listy w górę lub w dół, a tam nagłówki pokazują gdzie nie powinny być. –

18
/** 
    * @see android.widget.ListAdapter#getView(int, View, ViewGroup) 
    */ 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (!mDataValid) { 
      throw new IllegalStateException("this should only be called when the cursor is valid"); 
     } 
     if (!mCursor.moveToPosition(position)) { 
      throw new IllegalStateException("couldn't move cursor to position " + position); 
     } 
     View v; 
     if (convertView == null) { 
      v = newView(mContext, mCursor, parent); 
     } else { 
      v = convertView; 
     } 
     bindView(v, mContext, mCursor); 
     return v; 
    } 

Ten kod źródłowy CursorAdapter, wyraźnie cursorAdapter więcej.

2

Realizacja CursorAdapter różni się od sub-classing regularnych adapterów jak BaseAdapter, nie trzeba zastąpić getView(), getCount(), getItemId() dlatego, że informacje mogą być pobierane od samego kursora.

Biorąc pod uwagę Cursor, wystarczy zastąpić dwie metody tworzenia CursorAdapter podklasy:

bindView(): podany w widoku, należy zaktualizować go do wyświetlania danych w przewidzianym kursora.

newView(): Zostanie wywołany, aby dodać nowy widok, który znajduje się na liście.

Zajmuje się widokami recyklingu (w przeciwieństwie do metody getView() na zwykłym Adapter). Nie wymaga ona wywołania newView() za każdym razem, gdy potrzebuje nowego wiersza. Jeśli ma już numer View (nie null), będzie bezpośrednio wywoływał numer bindView(), w ten sposób utworzony widok zostanie ponownie użyty. Dzieląc tworzenie i populację każdego widoku na te dwie metody, uzyskuje się ponowne użycie widoku, w którym jak w zwykłych adapterach obie te rzeczy są wykonywane w metodzie getView().

+2

Dziękuję, bardzo pomocne. – LarsH

Powiązane problemy