Android 對封裝RecyclerView.Adapter講解
阿新 • • 發佈:2019-02-03
首先先得知RecyclerView.Adapter有什麼方法,這樣才知道與ListView的BaseAdapter有什麼區別:
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;
}
}