找到sdk目录下的: sdk/extras/android/m2repository/com/android/support/recyclerview-v7/21.0.0/recyclerview-v7-21.0.0.aar
解压出classes.jar, 改名recyclerview-v7-21.0.0.jar。放入libs目录中,就能使用android.support.v7.widget.RecyclerView
viewHolder
import android.content.Context;
import android.graphics.Bitmap;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
/**
* author : stone
* email : aa86799@163.com
* time : 15/10/11 14 38
*/
public class BaseRecyclerViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener, View.OnLongClickListener{
private View mItemView;
private SparseArray<View> mViews; //管理listView-item中的view
private OnItemClickListener onItemClickListener;
public interface OnItemClickListener {
void onItemClick(View view, int position);
boolean onItemLongClick(View view, int position);
}
private BaseRecyclerViewHolder(@NonNull View itemView,
@Nullable OnItemClickListener onItemClickListener) {
super(itemView);
// this.mItemView.setTag(this);
this.mItemView = itemView;
this.mViews = new SparseArray<View>();
this.onItemClickListener = onItemClickListener;
this.mItemView.setOnClickListener(this);
this.mItemView.setOnLongClickListener(this);
}
private BaseRecyclerViewHolder(Context context, int layoutId, ViewGroup parent,
@Nullable OnItemClickListener onItemClickListener) {
this(LayoutInflater.from(context).inflate(layoutId, parent), onItemClickListener);
}
public static BaseRecyclerViewHolder getInstance(Context context, int layoutId, ViewGroup parent,
@Nullable OnItemClickListener onItemClickListener) {
return new BaseRecyclerViewHolder(context, layoutId, parent, onItemClickListener);
}
@Override
public void onClick(View v) {
if (onItemClickListener != null){
onItemClickListener.onItemClick(itemView, getAdapterPosition());
}
}
@Override
public boolean onLongClick(View v) {
if (onItemClickListener != null){
//getAdapterPosition 返回由item-ViewHolder表示的adapter中的位置
return onItemClickListener.onItemLongClick(itemView, getAdapterPosition());
}
return false;
}
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mItemView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public <T> void setTag(int viewId, T tag) {
getView(viewId).setTag(tag);
}
public <T> T getTag(int viewId) {
return (T) getView(viewId).getTag();
}
/*------------------------ 设置view属性(以后扩展) --------------------------------*/
public BaseRecyclerViewHolder setText(int viewId, String text) {
((TextView) getView(viewId)).setText(text);
return this;
}
public BaseRecyclerViewHolder setText(int viewId, int resId) {//R.string.
((TextView) getView(viewId)).setText(resId);
return this;
}
public BaseRecyclerViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
((ImageView) getView(viewId)).setImageBitmap(bitmap);
return this;
}
public BaseRecyclerViewHolder setImageResource(int viewId, int resId) {
((ImageView) getView(viewId)).setImageResource(resId);
return this;
}
}
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
/**
* author : stone
* email : aa86799@163.com
* time : 15/10/11 14 22
*/
public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<BaseRecyclerViewHolder> {
protected List<T> mDatas;
protected Context mContext;
private int mLayoutID;
private BaseRecyclerViewHolder.OnItemClickListener mOnItemClickListener;
public BaseRecyclerViewAdapter(Context context, int layoutID, List<T> datas) {
this.mContext = context;
this.mLayoutID = layoutID;
this.mDatas = datas == null ? new ArrayList<T>() : datas;
}
public void setOnItemClickListener(BaseRecyclerViewHolder.OnItemClickListener onItemClickListener) {
this.mOnItemClickListener = onItemClickListener;
}
@Override
public BaseRecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
switch (viewType) {
//根据viewType 创建不同的ViewHolder
default:
break;
}
return BaseRecyclerViewHolder.getInstance(mContext, mLayoutID, null, mOnItemClickListener);
}
@Override
public void onBindViewHolder(final BaseRecyclerViewHolder holder, final int position) {
onBindViewHolderSetData(holder, position);
}
@Override
public int getItemCount() {
return mDatas.size();
}
public T getItem(int position) {
return (T) mDatas.get(position);
}
public abstract void onBindViewHolderSetData(@NonNull BaseRecyclerViewHolder holder, int position);
}
RecyclerView.Adapter内部管理RecyclerView.ViewHolder
使用定义的adapter
/**
* author : stone
* email : aa86799@163.com
* time : 15/9/22 17 05
*/
public final class RecommendRecyclerViewAdapter extends BaseRecyclerViewAdapter<RecommendData> {
public RecommendRecyclerViewAdapter(Context context, int layoutID, List<RecommendData> datas) {
super(context, layoutID, datas);
}
@Override
public void onBindViewHolderSetData(BaseRecyclerViewHolder holder, int position) {
RecommendData data = getItem(position);
//TextView tv = holder.getView(R.id.tv_title);
//tv.setText(data.getTitle());
holder.setText(R.id.tv_title, data.getTitle());
}
}
在使用adapter时,传入相应数据即可
一些方法:
mRecyclerView.setHasFixedSize(true); //固定size以优化
mLayoutManager = new LinearLayoutManager(this); //线性纵向
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); //横向
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); //纵向
//网格列表。HORIZONTAL 横向滚动显示内容, VERTICAL纵向;3表示行数; true 表示,将layout内容反转
mLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, true);
mLayoutManager = new GridLayoutManager(this, 1, GridLayoutManager.VERTICAL, false); //数字表示行数
mLayoutManager = new GridLayoutManager(this, 2, GridLayoutManager.HORIZONTAL, false);
//交错网格列表
mLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL);
mLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
//设置动画. DefaultItemAnimator是系统的一个默认实现. adapter.notifyItem方法会触发动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
adapter.notify方法:
notifyDataSetChanged(); //不会触发动画
notifyItemRangeChanged(int positionStart, int itemCount); //通知内容变化,需要刷新
notifyItemChanged(int position);
notifyItemChanged();
notifyItemRemoved(int position); //删除指定位置的item
notifyItemInserted(int position); //添加item到指定位置
//设置item的分隔样式,系统没有默认实现,官方例子中有一个:DividerItemDecoration
mRecyclerView.addItemDecoration(ItemDecoration decor);
a. 可以自定义一个LayoutManager, 需要extends RecyclerView.LayoutManager,以显示自定风格的布局
b. RecyclerView本身没有onItemClick的监听,需要自行添加:在重写它的ViewHolder时,有方法拿到position,可以拿到
当前位置,所以就可以添加一个itemClick的回调监听