// 学习学习再学习,学习定义自己的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"); } } } } }
@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); } }); }