Android 对封装RecyclerView.Adapter讲解
2017-02-14 21:52
645 查看
首先先得知RecyclerView.Adapter有什么方法,这样才知道与ListView的BaseAdapter有什么区别:
为了处理onBindViewHolder和onBindViewHolder故定义二个抽象方法:
在开发中,Adapter的数据都用List来处理的,所以把RecyclerAdatper封装成泛形:
其中RecyclerHolder 是对RecyclerView.ViewHolder一个封装,让子类可以快速开发:
public class MyAdapter extends RecyclerView.Adapter { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; // 返回创建一个ViewHolder } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { // 这里是刷新Item } @Override public int getItemCount() { return 0; // 有多少个Item } @Override public int getItemViewType(int position) { return super.getItemViewType(position); // 返回位置position,item的类型 } @Override public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) { super.registerAdapterDataObserver(observer); // 注册监听数据被刷新 } @Override public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) { super.unregisterAdapterDataObserver(observer); // 移除监听数据被刷新 } }
为了处理onBindViewHolder和onBindViewHolder故定义二个抽象方法:
/** * item布局ID * * @param viewType 类别 * @return item布局ID */ public abstract int getContentView(int viewType); /** * item刷新的回调 * * @param holder ViewHolder * @param object Item数据对象 * @param position 刷新的位置 */ public abstract void onInitView(RecyclerHolder holder, T object, int position);
在开发中,Adapter的数据都用List来处理的,所以把RecyclerAdatper封装成泛形:
package com.recycler.lib; import android.content.Context; import android.graphics.drawable.Drawable; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; /** * creater:cyy * time:2017/2/8 * describe:定义{@link android.support.v7.widget.RecyclerView}OnItemClickListener万能适配器 */ public abstract class RecyclerAdatper<T> extends RecyclerView.Adapter<RecyclerHolder> { private Context mContext; private List<T> mList; private OnItemClickListener mOnItemClickListener; public RecyclerAdatper(Context context) { this(context, new ArrayList<T>()); } public RecyclerAdatper(Context context, List<T> list) { mContext = context; mList = list; } public Context getContext() { return mContext; } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.mOnItemClickListener = onItemClickListener; } @Override public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new RecyclerHolder(getLayoutInflater().inflate(getContentView(viewType), parent, false)); } @Override public int getItemViewType(int position) { return super.getItemViewType(position); } @Override public void onBindViewHolder(final RecyclerHolder holder, final int position) { onInitView(holder, getItem(position), position); if (null != mOnItemClickListener) { // 实现item点击事件回调 holder.getView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onItemClick(holder, position); } }); } } @Override public int getItemCount() { if (null != mList) { return mList.size(); } return 0; } //---------------------------------abstract-------------------------------- /** * item布局ID * * @param viewType 类别 * @return item布局ID */ public abstract int getContentView(int viewType); /** * item刷新的回调 * * @param holder ViewHolder * @param object Item数据对象 * @param position 刷新的位置 */ public abstract void onInitView(RecyclerHolder holder, T object, int position); //---------------------------------List-------------------------------- public List<T> getList() { return mList; } public void setList(List<T> list) { this.mList = list; notifyDataSetChanged(); } public void clear() { this.mList.clear(); notifyDataSetChanged(); } public void remove(int location) { if (location >= 0 && mList.size() > location) { this.mList.remove(location); notifyDataSetChanged(); } } public void add(int location, T object) { if (object != null) { this.mList.add(location, object); notifyDataSetChanged(); } } public void addLast(T object) { if (object != null) { this.mList.add(object); notifyDataSetChanged(); } } public void addHead(T object) { if (object != null) { this.mList.add(0, object); notifyDataSetChanged(); } } public void addAll(List<T> list) { if (list != null) { this.mList.addAll(list); notifyDataSetChanged(); } } public T getItem(int position) { return mList.get(position); } //---------------------------------other-------------------------------- protected LayoutInflater getLayoutInflater() { return (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } /** * @param view converView * @param id 控件的id * @return 返回<T extends View> */ public static <E extends View> E get(View view, int id) { SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); if (null == viewHolder) { viewHolder = new SparseArray<View>(); view.setTag(viewHolder); } View childView = viewHolder.get(id); if (null == childView) { childView = view.findViewById(id); viewHolder.put(id, childView); } return (E) childView; } protected int getColor(int id) { return ContextCompat.getColor(getContext(), id); } protected String getString(int id) { return getContext().getResources().getString(id); } protected float getDimension(int id) { return getContext().getResources().getDimension(id); } protected Drawable getDrawable(int id) { return ContextCompat.getDrawable(getContext(), id); } }
其中RecyclerHolder 是对RecyclerView.ViewHolder一个封装,让子类可以快速开发:
package com.recycler.lib; import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.graphics.Paint; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.text.util.Linkify; import android.util.SparseArray; import android.view.View; import android.view.animation.AlphaAnimation; import android.widget.Adapter; import android.widget.AdapterView; import android.widget.Checkable; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RatingBar; import android.widget.TextView; /** * creater:cyy * time:2017/2/8 * describe: */ public class RecyclerHolder extends RecyclerView.ViewHolder { private View convertView; public RecyclerHolder(View itemView) { super(itemView); convertView = itemView; } public <T extends View> T getView(int viewId) { return retrieveView(viewId); } protected <T extends View> T retrieveView(int viewId) { SparseArray<View> viewHolder = (SparseArray<View>) convertView.getTag(); if (null == viewHolder) { viewHolder = new SparseArray<View>(); convertView.setTag(viewHolder); } View childView = viewHolder.get(viewId); if (null == childView) { childView = convertView.findViewById(viewId); viewHolder.put(viewId, childView); } return (T) childView; } public RecyclerHolder setText(int viewId, CharSequence value) { TextView view = retrieveView(viewId); if (TextUtils.isEmpty(value)) { view.setText(""); } else { view.setText(value); } return this; } public RecyclerHolder setImageResource(int viewId, int imageResId) { ImageView view = retrieveView(viewId); view.setImageResource(imageResId); return this; } public RecyclerHolder setBackgroundColor(int viewId, int color) { View view = retrieveView(viewId); view.setBackgroundColor(color); return this; } public RecyclerHolder setBackgroundRes(int viewId, int backgroundRes) { View view = retrieveView(viewId); view.setBackgroundResource(backgroundRes); return this; } public RecyclerHolder setTextColor(int viewId, int textColor) { TextView view = retrieveView(viewId); view.setTextColor(textColor); return this; } public RecyclerHolder setTextColorRes(int viewId, int textColorRes) { TextView view = retrieveView(viewId); view.setTextColor(ContextCompat.getColor(view.getContext(), textColorRes)); return this; } public RecyclerHolder setImageDrawable(int viewId, Drawable drawable) { ImageView view = retrieveView(viewId); view.setImageDrawable(drawable); return this; } public RecyclerHolder setImageBitmap(int viewId, Bitmap bitmap) { ImageView view = retrieveView(viewId); view.setImageBitmap(bitmap); return this; } @SuppressLint("NewApi") public RecyclerHolder setAlpha(int viewId, float value) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { retrieveView(viewId).setAlpha(value); } else { // Pre-honeycomb hack to set Alpha value AlphaAnimation alpha = new AlphaAnimation(value, value); alpha.setDuration(0); alpha.setFillAfter(true); retrieveView(viewId).startAnimation(alpha); } return this; } public RecyclerHolder setVisible(int viewId, boolean visible) { View view = retrieveView(viewId); view.setVisibility(visible ? View.VISIBLE : View.GONE); return this; } public RecyclerHolder setVisible(int viewId, int visibility) { View view = retrieveView(viewId); view.setVisibility(visibility); return this; } /** * Add links into a TextView. * * @param viewId The id of the TextView to linkify. * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder linkify(int viewId) { TextView view = retrieveView(viewId); Linkify.addLinks(view, Linkify.ALL); return this; } /** * Apply the typeface to the given viewId, and enable subpixel rendering. */ public RecyclerHolder setTypeface(int viewId, Typeface typeface) { TextView view = retrieveView(viewId); view.setTypeface(typeface); view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); return this; } /** * Apply the typeface to all the given viewIds, and enable subpixel * rendering. */ public RecyclerHolder setTypeface(Typeface typeface, int... viewIds) { for (int viewId : viewIds) { TextView view = retrieveView(viewId); view.setTypeface(typeface); view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); } return this; } /** * Sets the progress of a ProgressBar. * * @param viewId The view id. * @param progress The progress. * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setProgress(int viewId, int progress) { ProgressBar view = retrieveView(viewId); view.setProgress(progress); return this; } /** * Sets the progress and max of a ProgressBar. * * @param viewId The view id. * @param progress The progress. * @param max The max value of a ProgressBar. * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setProgress(int viewId, int progress, int max) { ProgressBar view = retrieveView(viewId); view.setMax(max); view.setProgress(progress); return this; } /** * Sets the range of a ProgressBar to 0...max. * * @param viewId The view id. * @param max The max value of a ProgressBar. * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setMax(int viewId, int max) { ProgressBar view = retrieveView(viewId); view.setMax(max); return this; } /** * Sets the rating (the number of stars filled) of a RatingBar. * * @param viewId The view id. * @param rating The rating. * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setRating(int viewId, float rating) { RatingBar view = retrieveView(viewId); view.setRating(rating); return this; } /** * Sets the rating (the number of stars filled) and max of a RatingBar. * * @param viewId The view id. * @param rating The rating. * @param max The range of the RatingBar to 0...max. * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setRating(int viewId, float rating, int max) { RatingBar view = retrieveView(viewId); view.setMax(max); view.setRating(rating); return this; } /** * Sets the tag of the view. * * @param viewId The view id. * @param tag The tag; * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setTag(int viewId, Object tag) { View view = retrieveView(viewId); view.setTag(tag); return this; } /** * Sets the tag of the view. * * @param viewId The view id. * @param key The key of tag; * @param tag The tag; * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setTag(int viewId, int key, Object tag) { View view = retrieveView(viewId); view.setTag(key, tag); return this; } /** * Sets the checked status of a checkable. * * @param viewId The view id. * @param checked The checked status; * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setChecked(int viewId, boolean checked) { Checkable view = (Checkable) retrieveView(viewId); view.setChecked(checked); return this; } /** * Sets the adapter of a adapter view. * * @param viewId The view id. * @param adapter The adapter; * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setAdapter(int viewId, Adapter adapter) { AdapterView view = retrieveView(viewId); view.setAdapter(adapter); return this; } /** * Sets the on click listener of the view. * * @param viewId The view id. * @param listener The on click listener; * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setOnClickListener(int viewId, View.OnClickListener listener) { View view = retrieveView(viewId); view.setOnClickListener(listener); return this; } public RecyclerHolder setOnCheckedChangeListener(int viewId, CompoundButton.OnCheckedChangeListener listener) { CompoundButton view = retrieveView(viewId); view.setOnCheckedChangeListener(listener); return this; } /** * Sets the on touch listener of the view. * * @param viewId The view id. * @param listener The on touch listener; * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setOnTouchListener(int viewId, View.OnTouchListener listener) { View view = retrieveView(viewId); view.setOnTouchListener(listener); return this; } /** * Sets the on long click listener of the view. * * @param viewId The view id. * @param listener The on long click listener; * @return The BaseAdapterHelper for chaining. */ public RecyclerHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) { View view = retrieveView(viewId); view.setOnLongClickListener(listener); return this; } /** * Retrieve the convertView */ public View getView() { return convertView; } }
相关文章推荐
- Android RecyclerView Adapter及Holder的封装【原创】
- Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构
- Android 封装RecyclerView.Adapter,省其ViewHolder
- Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(二)网络层的封装
- Android中对RecyclerView Adapter封装解析
- Android RecyclerView(五)封装Holder与Adapter(Android 5.0 新特性)
- Android 一起来封装一个 RecyclerViewAdapter
- Android 对ListView和RecyclerView的两个BaseAdapter封装分享
- Android RecyclerView封装RecyclerAdapter及解决与ScrollView冲突
- android简洁代码封装 -- RecyclerView.Adapter之MultiTypeAdapter封装
- Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(二)网络层的封装
- Android 封装RecyclerView的Adapter
- Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构
- RecyclerView 封装Adapter之BaseRecyclerAdapter
- Android开源之BaseRecyclerViewAdapterHelper(持续更新!)
- RecyclerView通用适配器Adapter,对Adapter的封装
- Android 利用RecyclerView.Adapter刷新列表中的单个view问题
- Android RecyclerView.Adapter notifyDataSetChanged 不起作用
- Android RecyclerView.Adapter的写法123
- 简单封装RecyclerView的Adapter