本文介绍了CursorAdapter的bindView优化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当覆盖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优化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-26 18:41