Пример #1
0
  // 学习学习再学习,学习定义自己的adapter,特定位置的特定视图,只能是图片或者文本
  // 为特定的view添加内容
  // 特定位置对view进行数据填充
  private void bindView(int position, View view) {
    final Map dataSet = mData.get(position);
    if (dataSet == null) {
      return;
    }

    final ViewBinder binder = mViewBinder;
    // 一个map中的数据,其key为string类型
    final String[] from = mFrom;
    // 对应的需要赋值的view
    final int[] to = mTo;
    // 需要进行填充的view的数量,to啊
    final int count = to.length;
    // 循环为每一个特定视图赋值
    for (int i = 0; i < count; i++) {
      final View v = view.findViewById(to[i]);
      if (v != null) {
        // 获取对应位置map对应的key的值
        final Object data = dataSet.get(from[i]);
        String text = data == null ? "" : data.toString();
        if (text == null) {
          // 防止错误
          text = "";
        }

        boolean bound = false;
        if (binder != null) {
          // bound是做什么用的呢
          bound = binder.setViewValue(v, data, text);
        }
        // 原来还可以有checkable
        if (!bound) {
          if (v instanceof Checkable) {
            if (data instanceof Boolean) {
              ((Checkable) v).setChecked((Boolean) data);
            } else if (v instanceof TextView) {
              // Note: keep the instanceof TextView check at the bottom of these
              // ifs since a lot of views are TextViews (e.g. CheckBoxes).
              setViewText((TextView) v, text);
            } else {
              throw new IllegalStateException(
                  v.getClass().getName()
                      + " should be bound to a Boolean, not a "
                      + (data == null ? "<unknown type>" : data.getClass()));
            }
          } else if (v instanceof TextView) {
            // Note: keep the instanceof TextView check at the bottom of these
            // ifs since a lot of views are TextViews (e.g. CheckBoxes).
            setViewText((TextView) v, text);
          } else if (v instanceof ImageView) {
            if (data instanceof Integer) {
              setViewImage((ImageView) v, (Integer) data);
            } else {
              setViewImage((ImageView) v, text);
            }
          } else {
            throw new IllegalStateException(
                v.getClass().getName()
                    + " is not a "
                    + " view that can be bounds by this SimpleAdapter");
          }
        }
      }
    }
  }
Пример #2
0
  @Override
  public void onBindViewHolder(RecycleViewHolder holder, int position) {

    if (mClientDataTable.isEmpty()) return;

    mClientDataTable.moveToPosition(position);

    if ((position >= getItemCount() - 1)) onLoadMore();

    int lListHolderSize = holder.mSparseArrayHolderViews.size();

    for (int i = 0; i < lListHolderSize; i++) {

      int lColumnIndex = holder.mSparseArrayHolderViews.keyAt(i);
      View lWidget = holder.mSparseArrayHolderViews.get(lColumnIndex);

      if (lWidget != null) {

        final TCell data = mClientDataTable.getCell(position, lColumnIndex);
        if (lWidget instanceof Checkable) {
          ((Checkable) lWidget).setChecked(data.asBoolean());
        } else if (lWidget instanceof TextView) {
          ((TextView) lWidget).setText(data.asString());
        } else if (lWidget instanceof UiPicassoImageView) {
          if (data.getValueType() == TCell.ValueType.BASE64) {
            try {
              throw new WrongTypeException(mContext, R.string.exception_canotUserBase64);
            } catch (WrongTypeException e) {
              e.printStackTrace();
            }
          } else {
            UiPicassoImageView picassoImageView = (UiPicassoImageView) lWidget;
            picassoImageView.setData(data.asString(), mIsNotUsePicassoCache);
          }
        } else if (lWidget instanceof ImageView) {
          ImageView im = (ImageView) lWidget;
          if (data.getValueType() == TCell.ValueType.INTEGER && !data.asString().isEmpty()) {
            im.setImageResource(data.asInteger());
          } else if (data.getValueType() == TCell.ValueType.BASE64) {
            byte[] decodedString = Base64.decode(data.asString(), Base64.NO_WRAP);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = mBase64OptionSize;
            Bitmap decodedByte =
                BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length, options);
            im.setImageBitmap(decodedByte);
          } else {
            if (!data.asString().equals("")) setViewImage((ImageView) lWidget, data.asString());
            else im.setImageDrawable(null);
          }
        } else if (lWidget instanceof Spinner) {
          Spinner spinner = ((Spinner) lWidget);
          if (spinner.getAdapter() instanceof ArrayAdapter) {
            ArrayAdapter arrayAdapter = (ArrayAdapter) spinner.getAdapter();
            spinner.setSelection(arrayAdapter.getPosition(data.asString()));
          } else
            Log.e(
                this.getClass().getName(),
                "Cannot set Spinner default value, because Spinner Adapter is not ArrayAdapter Type, you need to customize it in onIterateWidget method");
        }

        onIteratedRow(holder.mRowView, lWidget, lWidget.getTag().toString());
      }
    }
    int lListHolderSizeNotInCDT = holder.mSparseArrayHolderViewsNotInCDT.size();

    for (int i = 0; i < lListHolderSizeNotInCDT; i++) {
      int lColumnIndex = holder.mSparseArrayHolderViewsNotInCDT.keyAt(i);
      View lWidget = holder.mSparseArrayHolderViewsNotInCDT.get(lColumnIndex);

      if (lWidget != null) {
        onIteratedRow(holder.mRowView, lWidget, lWidget.getTag().toString());
      }
    }

    // ClickListener
    holder.setClickListener(
        new OnRecycleClickListener() {
          @Override
          public void onClick(View v, int position) {
            onClickRow(v, position);
          }

          @Override
          public void onLongClick(View v, int position) {
            onLongClickRow(v, position);
          }
        });

    holder.setOnRecycleWidgetClickListener(
        new OnRecycleWidgetClickListener() {

          @Override
          public void onClick(View parentView, View clickedView, String tag, int position) {
            onClickWidget(parentView, clickedView, tag, position);
          }
        });

    holder.setOnRecycleCheckedRadioButtonGroupChangeListener(
        new OnRecycleCheckedRadioButtonGroupChangeListener() {
          @Override
          public void onCheckedChanged(
              View parentView,
              RadioGroup radioButtonGroup,
              String widgetTag,
              int radioButtonID,
              int position) {
            onCheckRadioButtonGroupWidget(
                parentView, radioButtonGroup, widgetTag, radioButtonID, position);
          }
        });

    holder.setOnRecycleCheckedChangeListener(
        new OnRecycleCheckedChangeListener() {
          @Override
          public void onCheckedChanged(
              boolean isWidgetInCDT, CompoundButton buttonView, boolean isChecked, int position) {

            if (!isWidgetInCDT || position >= mClientDataTable.getRowsCount()) return;

            String columnName = buttonView.getTag().toString();
            mClientDataTable.moveToPosition(position);
            mClientDataTable.cellByName(columnName).setValue(isChecked);
          }
        });

    holder.setOnRecycleTextWatcher(
        new OnRecycleTextWatcher() {
          @Override
          public void afterTextChanged(
              boolean isWidgetInCDT, EditText v, String newText, int position) {
            if (!isWidgetInCDT
                || position >= mClientDataTable.getRowsCount()
                || !(v.isFocusable() || v.isFocusableInTouchMode())) return;

            mClientDataTable.moveToPosition(position);
            String columnName = v.getTag().toString();
            mClientDataTable.cellByName(columnName).setValue(newText);
          }
        });
  }