问题描述
下面是我的自定义的CursorAdapter:
Here is my custom CursorAdapter:
public class TasksAdapter extends CursorAdapter implements Filterable {
private final Context context;
public TasksAdapter(Context context, Cursor c) {
super(context, c);
this.context = context;
}
/**
* @see android.widget.CursorAdapter#newView(android.content.Context, android.database.Cursor, android.view.ViewGroup)
*/
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(android.R.layout.simple_list_item_checked, parent, false);
ViewHolder holder = new ViewHolder();
holder.textview = (CheckedTextView)v.findViewById(android.R.id.text1);
v.setTag(holder);
return v;
}
/**
* @see android.widget.CursorAdapter#bindView(android.view.View, android.content.Context, android.database.Cursor)
*/
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder)view.getTag();
int titleCol = cursor.getColumnIndexOrThrow(Tasks.TITLE);
int completedCol = cursor.getColumnIndexOrThrow(Tasks.COMPLETED);
String title = cursor.getString(titleCol);
boolean completed = Util.intToBool(cursor.getInt(completedCol));
holder.textview.setText(title);
holder.textview.setChecked(completed);
}
/**
* @see android.widget.CursorAdapter#runQueryOnBackgroundThread(java.lang.CharSequence)
*/
@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
StringBuffer buffer = null;
String[] args = null;
if (constraint != null) {
buffer = new StringBuffer();
buffer.append("UPPER (");
buffer.append(Tasks.TITLE);
buffer.append(") GLOB ?");
args = new String[] { "*" + constraint.toString().toUpperCase() + "*" };
}
Cursor c = context.getContentResolver().query(Tasks.CONTENT_URI,
null, (buffer == null ? null : buffer.toString()), args,
Tasks.DEFAULT_SORT_ORDER);
c.moveToFirst();
return c;
}
/**
* @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
*/
@Override
public CharSequence convertToString(Cursor cursor) {
final int titleCol = cursor.getColumnIndexOrThrow(Tasks.TITLE);
String title = cursor.getString(titleCol);
return title;
}
static class ViewHolder {
CheckedTextView textview;
}
}
这是否落入ViewHolder模式的约束?我不知道,因为这是一个CursorAdapter的,在没有 getView
。如果有任何问题或建议,请你指出来。
Does this fall into the constraints of the ViewHolder pattern? I wasn't sure because this was a CursorAdapter, where there was no getView
. If there are any problems or suggestions, could you please point them out.
推荐答案
的CursorAdapter
将不会调用 NewView的
每次它需要一个新的行;如果已经有一个查看
,它会调用 bindView
,所以创建的视图实际上是重复使用。
CursorAdapter
won't call the newView
each time it needs a new row; if it already has a View
, it will call the bindView
, so the created view is actually reused.
不过,正如指出的约瑟夫的意见,你仍然可以使用ViewHolder为了避免调用 findViewById
反复。
That said, as pointed out by Joseph in the comments, you can still use ViewHolder in order to avoid calling findViewById
repeatedly.
如果你仍然在意效率再看看在<一个href="http://www.google.com/$c$csearch/p?hl=en#oOy_5JrVRNM/trunk/frameworks/base/core/java/android/widget/SimpleCursorAdapter.java&q=simplecursoradapter.java%20android&sa=N&cd=1&ct=rc"><$c$c>SimpleCursorAdapter$c$c>实现,它采用了的WeakHashMap
(的地图在WeakReferences
):
If you are still concerned about efficiency then take a look at the SimpleCursorAdapter
implementation, which uses a WeakHashMap
(a map of WeakReferences
):
WeakHashMap<View, View[]> mHolders = new WeakHashMap<View, View[]>();
这篇关于ViewHolder模式自定义CursorAdapter的正确实施?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!