首页 文章

setViewBinder / setViewValue和getView / LayoutInflater的用法有什么区别?

提问于
浏览
3

看起来有两种可能的方法来改变 ListView 行中的某些内容:

  • 使用 setViewBinder / setViewValue

myCursor.setViewBinder(new SimpleCursorAdapter.ViewBinder(){

@Override
  public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
    int viewId = view.getId();
    switch(viewId) {
    case R.id.icon:
        // change something related to the icon here
  • 使用 getView / LayoutInflater

public View getView(int position,View convertView,ViewGroup parent){

View itemView = null;

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) parent.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        itemView = inflater.inflate(R.layout.list_row, null);
    } else {
        itemView = convertView;
    }

    ImageView imgViewChecked = (ImageView) itemView
            .findViewById(R.id.icon);
    // change something related to the icon here

这两种方法有什么区别?

1 回答

  • 3

    您可以使用它们来完成相同的任务 . ViewCinder系统由SimpleCursorAdapter添加,使您更轻松,因此您不必编写整个getView代码 . 实际上,SimpleCursorAdapter只是通过调用setViewValue方法(以及标准样板错误检查和膨胀)来实现getView .

    我已经附加了Android源代码在SimpleCursorAdapter中用于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;
    }
    
    
    public void bindView(View view, Context context, Cursor cursor) {
      final ViewBinder binder = mViewBinder;
      final int count = mTo.length;
      final int[] from = mFrom;
      final int[] to = mTo;
    
      for (int i = 0; i < count; i++) {
        final View v = view.findViewById(to[i]);
        if (v != null) {
          boolean bound = false;
          if (binder != null) {
            bound = binder.setViewValue(v, cursor, from[i]);
          }
    
          if (!bound) {
            String text = cursor.getString(from[i]);
            if (text == null) {
              text = "";
            }
    
            if (v instanceof TextView) {
              setViewText((TextView) v, text);
            } else if (v instanceof ImageView) {
              setViewImage((ImageView) v, text);
            } else {
              throw new IllegalStateException(
                  v.getClass().getName()
                      + " is not a "
                      + " view that can be bounds by this SimpleCursorAdapter");
            }
          }
        }
      }
    }
    

相关问题