问题描述
当覆盖ArrayAdapter我知道用这样的模式是正确的:
When overriding ArrayAdapter I know is correct using a pattern like this:
if(view != null){
...create new view setting fields from data
}else
return view; //reuse view
时,正确使用太多这种模式与CursorAdapters?我的问题是,我有一个文本颜色可以是红色或蓝色按光标场,所以我不希望像一个红色的颜色上有一个字段需要蓝色的单元格的任何错误。我bindView code是这样的:
is correct too using this pattern with CursorAdapters? My problem is that I have a textcolor which can be red or blue according to a cursor field, so I don't want any errors like a red color on a cell which has a field needing blue color.My bindView code is something like this:
if(c.getString(2).equals("red"))
textView.setTextColor(<red here>);
else
textView.setTextColor(<blue here>);
如果我重新使用视图,我可以肯定的是红色的那张红色,而蓝色那张蓝色的?
if I reuse view can I be sure that red goes on red, while blue goes on blue?
推荐答案
在的CursorAdapter
,你在布局 NewView的
和 bindView
绑定数据。 的CursorAdapter
已经做重用格局 getView
让您不必再做了 。以下是原始 getView
源$ C $ C。
In CursorAdapter
, you get layout in newView
and bind data in bindView
. CursorAdapter
already do reuse pattern in getView
so you don't have to do it again. Below is the original getView
source code.
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;
}
如果你想使用进一步优化 ViewHolder模式
这里是例子:创建 NewView的
标记和检索 bindView
If you want further optimization using ViewHolder Pattern
here is example: Create tag in newView
and retrieve in bindView
public class TimeListAdapter extends CursorAdapter {
private LayoutInflater inflater;
private static class ViewHolder {
int nameIndex;
int timeIndex;
TextView name;
TextView time;
}
public TimeListAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.name.setText(cursor.getString(holder.nameIndex));
holder.time.setText(cursor.getString(holder.timeIndex));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup
p parent) {
View view = inflater.inflate(R.layout.time_row, null);
ViewHolder holder = new ViewHolder();
holder.name = (TextView) view.findViewById(R.id.task_name);
holder.time = (TextView) view.findViewById(R.id.task_time);
holder.nameIndex = cursor.getColumnIndexOrThrow
p (TaskProvider.Task.NAME);
holder.timeIndex = cursor.getColumnIndexOrThrow
p (TaskProvider.Task.DATE);
view.setTag(holder);
return view;
}
}
这篇关于CursorAdapter的bindView优化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!