您的位置:首页 > 移动开发 > Android开发

Android 对封装RecyclerView.Adapter讲解

2017-02-14 21:52 645 查看
首先先得知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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android RecyclerVi