Więc oglądam to wideo http://www.youtube.com/watch?v=N6YdwzAvwOA, a Romain Guy pokazuje, jak zrobić bardziej wydajny kod adaptera UI przy użyciu metody getView()
. Czy dotyczy to również CursorAdapters? Obecnie używam bindView()
i newView()
dla moich niestandardowych adapterów kursorów. Czy zamiast tego powinienem używać getView?GetView vs. BindView w niestandardowym CursorAdapter?
Odpowiedz
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()
.
/**
* @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.
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()
.
Dziękuję, bardzo pomocne. – LarsH
Jak zastosować wzór ViewHolder? Czy podzieliłbym go między newView() i bindView()? –
@Scienceprodigy: W 'newView()' utworzysz 'ViewHolder' dla wiersza i powiążesz go z' setTag() '. W 'bindView()' pobierałbyś 'ViewHolder' przez' getTag() '. – CommonsWare
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ć. –