So, I'm watching this video http://www.youtube.com/watch?v=N6YdwzAvwOA and Romain Guy is showing how to make more efficient UI adapter code using the getView()
method. Does this apply to CursorAdapters as well? I'm currently using bindView()
and newView()
for my custom cursor adapters. Should I be using getView instead?
CursorAdapter
has an implementation of getView()
that delegates to newView()
and bindView()
, in such a way as enforces the row recycling pattern. Hence, you do not need to do anything special with a CursorAdapter
for row recycling if you are overriding newView()
and bindView()
.
newView()
, you would create the ViewHolder
for the row and associate it with setTag()
. In bindView()
, you would retrieve the ViewHolder
via getTag()
. –
Chrestomathy getViewTypeCount()
and getItemViewType()
. –
Chrestomathy AdapterView
. –
Chrestomathy notifyDataSetChanged()
in this way –
Mande ViewHolder
pattern, should you choose to use it, is relevant for all adapters. ArrayAdapter
also recycles rows, for example. –
Chrestomathy /**
* @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;
}
This CursorAdapter source code, clearly cursorAdapter work more.
The CursorAdapter
implementation is different from sub-classing regular adapters like BaseAdapter
, you don't need to override getView()
, getCount()
, getItemId()
because that information can be retrieved from the cursor itself.
Given a Cursor
, you only need to override two methods to create a CursorAdapter
subclass:
bindView()
: Given a view, update it to display the data in the provided cursor.
newView()
: This gets called to consctruct a new view that goes into the the list.
The CursorAdapter
will take care of recycling views (unlike the getView()
method on regular Adapter
). It doesn't call the newView()
each time it needs a new row. If it already has a View
(not null
), it will directly call the bindView()
, this way, the created view is reused. By splitting the creation and population of each view into these two methods, the CursorAdapter
achieves view reuse where as, in regular adapters, both these things are done in getView()
method.
© 2022 - 2024 — McMap. All rights reserved.