CursorAdapter bindView优化

时间:2012-08-31 22:39:05

标签: android android-cursoradapter android-adapter

当重写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>);

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

2 个答案:

答案 0 :(得分:37)

CursorAdapter中,您可以在newView中获得布局,并在bindView中绑定数据。 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中创建代码并在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 
         (TaskProvider.Task.NAME);
         holder.timeIndex   =   cursor.getColumnIndexOrThrow    
         (TaskProvider.Task.DATE);
         view.setTag(holder);
    return view;
  }
}

答案 1 :(得分:2)

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

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