package cn.sinata.xldutils.adapter; /** * Created by ningpeng on 16/11/30. */ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Paint; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Build; import android.text.util.Linkify; import android.util.SparseArray; import android.view.View; import android.view.animation.AlphaAnimation; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.DrawableRes; import androidx.annotation.StringRes; import androidx.recyclerview.widget.RecyclerView; import java.util.HashSet; import java.util.LinkedHashSet; class BaseViewHolder extends RecyclerView.ViewHolder { /** * 使用LinkedHashSet 代表可序列化的id 集合 * SparseArray类似于HasMap的集合。 */ private final SparseArray views; private final LinkedHashSet childClickViewIds; private final LinkedHashSet itemChildLongClickViewIds; public View convertView; /** * 提供一个Object类 用来保留关联对象的改变。虽然并没有什么卵用 */ Object associatedObject; public BaseViewHolder(View view) { super(view); this.views = new SparseArray(); this.childClickViewIds = new LinkedHashSet<>(); this.itemChildLongClickViewIds = new LinkedHashSet<>(); convertView = view; } public HashSet getItemChildLongClickViewIds() { return itemChildLongClickViewIds; } public HashSet getChildClickViewIds() { return childClickViewIds; } public View getConvertView() { return convertView; } /** *在这儿给 Textview类型的控件赋值并找到id */ public BaseViewHolder setText(int viewId, CharSequence value) { TextView view = getView(viewId); view.setText(value); return this; } public BaseViewHolder setText(int viewId, @StringRes int strId) { TextView view = getView(viewId); view.setText(strId); return this; } /** * *在这儿给Imageview类型的控件设置背景并找到id */ public BaseViewHolder setImageResource(int viewId,@DrawableRes int imageResId) { ImageView view = getView(viewId); view.setImageResource(imageResId); return this; } /** * 在这儿给view类型的控件设置背景颜色并找到id */ public BaseViewHolder setBackgroundColor(int viewId, int color, Context context) { View view = getView(viewId); view.setBackgroundResource(color); return this; } /** * 在这儿给view类型的控件设置背景颜色并找到id */ public BaseViewHolder setBackgroundRes(int viewId, @DrawableRes int backgroundRes) { View view = getView(viewId); view.setBackgroundResource(backgroundRes); return this; } /** * 设置 TextView 颜色 */ public BaseViewHolder setTextColor(int viewId, int textColor) { TextView view = getView(viewId); view.setTextColor(textColor); return this; } /** * 设置Imageview src属性 drawble */ public BaseViewHolder setImageDrawable(int viewId, Drawable drawable) { ImageView view = getView(viewId); view.setImageDrawable(drawable); return this; } /** * 设置Imageview src属性 bitmap */ public BaseViewHolder setImageBitmap(int viewId, Bitmap bitmap) { ImageView view = getView(viewId); view.setImageBitmap(bitmap); return this; } /** * 设置view的 透明度 0 到 1 */ public BaseViewHolder setAlpha(int viewId, float value) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getView(viewId).setAlpha(value); } else { // Pre-honeycomb hack to set Alpha value AlphaAnimation alpha = new AlphaAnimation(value, value); alpha.setDuration(0); alpha.setFillAfter(true); getView(viewId).startAnimation(alpha); } return this; } /** *设置view 是否可见 */ public BaseViewHolder setVisible(int viewId, boolean visible) { View view = getView(viewId); view.setVisibility(visible ? View.VISIBLE : View.GONE); return this; } /** *设置view的 超链接属性 */ public BaseViewHolder linkify(int viewId) { TextView view = getView(viewId); Linkify.addLinks(view, Linkify.ALL); return this; } /** * 设置TextView 的字体为超链接 */ public BaseViewHolder setTypeface(int viewId, Typeface typeface) { TextView view = getView(viewId); view.setTypeface(typeface); view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); return this; } /** * 设置TextView 的字体为超链接 */ public BaseViewHolder setTypeface(Typeface typeface, int... viewIds) { for (int viewId : viewIds) { TextView view = getView(viewId); view.setTypeface(typeface); view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); } return this; } /** * 控件点击事件 */ @Deprecated public BaseViewHolder setOnClickListener(int viewId, View.OnClickListener listener) { View view = getView(viewId); view.setOnClickListener(listener); return this; } /** * 添加子view 的id 到点击事件id数组里面 */ public BaseViewHolder addOnClickListener(int viewId) { childClickViewIds.add(viewId); return this; } /** * 添加子view 的id 到长按事件id数组里面 */ public BaseViewHolder addOnLongClickListener(int viewId){ itemChildLongClickViewIds.add(viewId); return this; } /** * view的触摸事件 */ public BaseViewHolder setOnTouchListener(int viewId, View.OnTouchListener listener) { View view = getView(viewId); view.setOnTouchListener(listener); return this; } /** * view的长按事件 */ public BaseViewHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) { View view = getView(viewId); view.setOnLongClickListener(listener); return this; } /** * */ public BaseViewHolder setOnItemClickListener(int viewId, AdapterView.OnItemClickListener listener) { AdapterView view = getView(viewId); view.setOnItemClickListener(listener); return this; } /** * checkBox点击事件 */ public BaseViewHolder setOnCheckedChangeListener(int viewId, CheckBox.OnCheckedChangeListener listener) { CheckBox view = getView(viewId); view.setOnCheckedChangeListener(listener); return this; } /** * set Tag 无标记 */ public BaseViewHolder setTag(int viewId, Object tag) { View view = getView(viewId); view.setTag(tag); return this; } /** * 设置tag有标记 */ public BaseViewHolder setTag(int viewId, int key, Object tag) { View view = getView(viewId); view.setTag(key, tag); return this; } /** * checkBox的状态 */ public BaseViewHolder setChecked(int viewId, boolean checked) { View view = getView(viewId); // View unable cast to Checkable if (view instanceof CheckBox) { ((CheckBox) view).setChecked(checked); } return this; } @SuppressWarnings("unchecked") public T getView(int viewId) { View view = views.get(viewId); if (view == null) { view = convertView.findViewById(viewId); views.put(viewId, view); } return (T) view; } /** * Retrieves the last converted object on this view. */ public Object getAssociatedObject() { return associatedObject; } /** * Should be called during convert */ public void setAssociatedObject(Object associatedObject) { this.associatedObject = associatedObject; } }