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
- 1. SimpleCursorAdapter vs CursorAdapter?
- 2. ViewHolder wzór poprawnie zaimplementowany w niestandardowym CursorAdapter?
- 3. CursorAdapter vs ArrayAdapter dla ListView
- 4. Android - Czy wzorzec ViewHolder jest automatycznie implementowany w CursorAdapter?
- 5. SimpleCursorAdapter i CursorAdapter
- 6. Czy to niestandardowy CursorAdapter dla ListView poprawnie zakodowany dla Androida?
- 7. Android: jak korzystać z CursorAdapter?
- 8. Wyjaśnienie metody getView() dla ArrayAdaptera
- 9. Kiedy getView() w ArrayAdapter nazywa się
- 10. AlphabetIndexer z niestandardowym adapterem
- 11. Jaka jest różnica między `@ Bind` i` @ BindView` w maśle noża?
- 12. Nie można zaznaczyć/odznaczyć opcji CheckedTextView wewnątrz getView
- 13. Android - ListView - wywołanie getView() na żądanie
- 14. setOnItemClickListener w niestandardowym ListView
- 15. Powiązanie danych Androida z niestandardowym adapterem
- 16. EXC_BAD_ACCESS na niestandardowym UIView z niestandardowym XIB
- 17. getView nazywa się kilka razy na pierwszej pozycji w GridView
- 18. Fragment wewnątrz ViewPager zwracający wartość null w getView()
- 19. Android, List Adapter zwraca błędną pozycję w getView
- 20. Recykling widoków w niestandardowym adapterze tablicowym: jak dokładnie jest obsługiwany?
- 21. W niestandardowym systemie projektów VS 2017, w jaki sposób można pogrubić projekt w eksploratorze rozwiązań?
- 22. setOnItemClickListener() nie działa na niestandardowym ListView @ Android
- 23. Implementowanie ClickHandler w niestandardowym Widget
- 24. Tłumienie moreNavigationController w niestandardowym UITabBarController
- 25. Android findViewById() w widoku niestandardowym
- 26. Android 4.0.3 CursorAdapter nie zapełnia ListView na changeCursor
- 27. Jak ustawić domyślną wartość kolorów w formancie niestandardowym w WinForm?
- 28. Pole wyboru zostaje odznaczone przy przewijaniu w niestandardowym widoku listy.
- 29. Jak jest używana metoda getView() i gdzie jest wywoływana?
- 30. NullPointerException Ostrzeżenie na getView() wewnątrz onActivityCreated/onStart/onViewCreated metoda
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ć. –