CursorAdapter bindView optimization

后端 未结 2 535
渐次进展
渐次进展 2020-12-14 03:23

When overriding ArrayAdapter I know is correct using a pattern like this:

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


        
相关标签:
2条回答
  • 2020-12-14 03:48

    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;
    }
    

    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 
             (TaskProvider.Task.NAME);
             holder.timeIndex   =   cursor.getColumnIndexOrThrow    
             (TaskProvider.Task.DATE);
             view.setTag(holder);
        return view;
      }
    }
    
    0 讨论(0)
  • 2020-12-14 04:10

    Yes, getView is in Adapter and is not dependant from ArrayAdapter nor CursorAdapter.

    recycling is always a good practice. Ensure that your code sets a colour in every situation.

    0 讨论(0)
提交回复
热议问题