CursorAdapter bindView优化

当重写ArrayAdapter我知道是正确的使用这样的模式:

if(view != null){ ...create new view setting fields from data }else return view; //reuse view 

在CursorAdapters中使用这个模式是否正确? 我的问题是,我有一个文本颜色,可以是红色或蓝色根据游标字段,所以我不希望任何错误像一个红色的单元格有一个领域需要蓝色。 我的bindView代码是这样的:

 if(c.getString(2).equals("red")) textView.setTextColor(<red here>); else textView.setTextColor(<blue here>); 

如果我重新使用视图,我可以确定红色是红色的,而蓝色是蓝色的?

Solutions Collecting From Web of "CursorAdapter bindView优化"

CursorAdapter ,您可以在newView获得布局,并在newView绑定数据。 CursorAdapter已经在getView重复使用了模式,所以你不必再做一次 。 以下是原始的getView源代码。

  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 Pattern进一步优化,例如:在newView创build标签,并在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; } } 

是的, getView是在Adapter ,不依赖于ArrayAdapterCursorAdapter

回收总是一个好的做法。 确保您的代码在每种情况下都设置颜色。