参考:https://blog.csdn.net/u012124438/article/details/53495951
一、RecyclerView 的优点
① RecyclerView封装了viewholder的回收复用,也就是说RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
② 提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager等),也就是说RecyclerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。你想控制Item的分隔线,可以通过继承RecyclerView的ItemDecoration这个类,然后针对自己的业务需求去抒写代码。
③ 可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecyclerView有其自己默认的实现。
二、RecyclerView的使用
适配器优化
public class YAdapter extends RecyclerView.Adapter<YAdapter.MyViewHolder> {
private Context mContext;
private List<String> mDatas;
public YAdapter(Context context,List<String> datas){
this.mContext = context;
this.mDatas = datas;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 填充布局
View view =LayoutInflater.from(mContext).inflate(R.layout.item_project,null);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(mDatas.get(position).toString());
}
@Override
public int getItemCount() {
return mDatas==null?0:mDatas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
private TextView tv;
public MyViewHolder(View itemView) {
super(itemView);
tv=(TextView)itemView.findViewById(R.id.tv_item);
}
}
}
RecyclerView的使用
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
// 设置布局管理器
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(layoutManager);
// 设置适配器
mRecyclerView.setAdapter(new MyRecyclerAdapter(this, mDatas));
三、通用之ViewHolder
public class RecyclerBaseViewHolder extends RecyclerView.ViewHolder {
private Context mContext;
private View mConvertView;
private SparseArray<View> mViews;
public RecyclerBaseViewHolder(View itemView) {
super(itemView);
}
public RecyclerBaseViewHolder (Context context, View convertView){
this(convertView);
this.mContext=context;
if (mViews==null){
mViews=new SparseArray<>();
}
mConvertView=convertView;
mConvertView.setTag(this);
}
public static RecyclerBaseViewHolder getInstance(Context context, View convertView){
return new RecyclerBaseViewHolder(context,convertView);
}
public <T extends View>T getView(int resId){
View view=mViews.get(resId);
if (view==null){
view=mConvertView.findViewById(resId);
mViews.put(resId,view);
}
return (T)view;
}
public View getConvertView(){
return mConvertView;
}
}
2.通用之抽象Adapter
public abstract class BaseReclerView<T> extends RecyclerView.Adapter<RecyclerBaseViewHolder> {
private static final String TAG = "BaseReclerView";
public List<T> mdata;
public Context mContext;
View mConvertView;
int mlayoutID;
public BaseReclerView(Context context,int layoutID, List<T> data){
mContext=context;
if (data==null){
this.mdata=new ArrayList<>();
}else {
this.mdata=data;
}
mlayoutID=layoutID;
}
@Override
public RecyclerBaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
mConvertView= LayoutInflater.from(mContext).inflate(mlayoutID,null);
RecyclerBaseViewHolder recyclerBaseViewHolder=RecyclerBaseViewHolder.getInstance(mContext,mConvertView);
return recyclerBaseViewHolder;
}
@Override
public void onBindViewHolder(RecyclerBaseViewHolder holder, int position) {
getView(holder,position);
}
@Override
public int getItemCount() {
return mdata==null?0:mdata.size();
}
public abstract void getView(RecyclerBaseViewHolder holder,int position);
}
3.通用之继承抽象Adapter
public class DetailAdapter extends BaseReclerView<String>{
private static final String TAG = "DetailAdapter";
private ArrayList<String> data;
private List<String> mimgIdList;
private SparseArray<CheckBox> cbMap;
public List<String> cbIdList;
private List<Integer> tagList;
private ProgressDialog pd;
public DetailAdapter(Context context,ArrayList<String> data,int resId){
super(context,resId,data);
if (null == mimgIdList) {
mimgIdList = new ArrayList<>();
}
if (null == cbIdList) {
cbIdList = new ArrayList<>();
}
if (cbMap == null) {
cbMap = new SparseArray<>();
}
if (tagList == null) {
tagList = new ArrayList<>();
}
}
@Override
public void getView(RecyclerBaseViewHolder holder, final int position) {
Log.d(TAG, "getView: ");
CheckBox cb=holder.getView(R.id.cb_photo);
ImageView iv=holder.getView(R.id.img_item);
cb.setTag(position);
iv.setTag(position);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: i am"+position);
}
});
Picasso.with(mContext).load(mdata.get(position)).transform(new CropTransfromation()).placeholder(R.drawable.icon_load).into(iv);
}
private class CropTransfromation implements Transformation{
@Override
public Bitmap transform(Bitmap bitmap) {
int size=Math.min(bitmap.getWidth(),bitmap.getHeight());
int x= (bitmap.getWidth()-size)/2;
int y= (bitmap.getHeight()-size)/2;
Bitmap result=Bitmap.createBitmap(bitmap,x,y,size,size);
if (result!=bitmap){
bitmap.recycle();
}
return result;
}
@Override
public String key() {
return "OJBK";
}
}
public void setData(List<String> data, List<String> imgIdList) {
if (data == null) {
this.mdata = new ArrayList<>();
} else {
this.mdata = data;
}
if (imgIdList == null) {
this.mimgIdList = new ArrayList<>();
} else {
this.mimgIdList = imgIdList;
}
this.notifyDataSetChanged();
}
}