学习笔记 Tianmao 篇 RecyclerView.Adapter 的封装

来源:互联网 发布:织梦 查询语句 编辑:程序博客网 时间:2024/05/19 18:13

零.这能可能很不成熟 但是效果能出来

一.先写一个基础类BaseRecycleAdapter

1.构造函数要传进来

    private Context context;    private List list;

2. 有两个抽象方法用于在真正的Adapter 中根据view类型使用对应的方法

    abstract RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType);    abstract void onBindViewHolder(RecyclerView.ViewHolder holder, int position);

3.要有 getList() getContext()用于子类获取list和context

public Context getContext() {    return context;}public List getList() {    return list;}

4.这是代码

package pers.lijunxue.tianmao.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.ViewGroup;import java.util.List; Created by rabook on 2016/10/22.abstract class BaseRecycleAdapter {    private Context context;    private List list;    public BaseRecycleAdapter(List list , Context context){        this.list = list;        this.context = context;    }    abstract RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType);    abstract void onBindViewHolder(RecyclerView.ViewHolder holder, int position);    public List getList() {        return list;    }    public Context getContext() {        return context;    }}

二.写真正的Adapter类继承RecyclerView.Adapter

1. 属性分为 list、context 和各个假的RecycleAdapterImpl

2. 注:(这个RecycleAdapterImpl继承基础类BaseRecycleAdapter)

List<ViewBean> list;private Context context;   //这里放可能要用到的Adapterprivate         private HomeFirstRecycleAdapterImpl homeFirstItemAdapterImpl;        private HomeSecondRecycleAdapterImpl homeSecondItemAdapterImpl;

3.写出onCreateViewHolder方法 这里就要用到RecycleAdapterImpl类了,这个辅助类根据Viewbean的类型使用响应类的方法

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        //根据类型实力化RecycleAdapterImpl        switch (viewType)        {            case HomeFirstViewBean.TYPE:                homeFirstItemAdapterImpl = new HomeFirstRecycleAdapterImpl(list,context);                return homeFirstItemAdapterImpl.onCreateViewHolder(parent,viewType);            case HomeSecondViewBean.TYPE:                homeSecondItemAdapterImpl = new HomeSecondRecycleAdapterImpl(list,context);                return homeSecondItemAdapterImpl.onCreateViewHolder(parent,viewType);            case HomeThirdViewBean.TYPE:                homeThirdItemAdapterImpl = new HomeThirdRecycleAdapterImpl(list,context);                return homeThirdItemAdapterImpl.onCreateViewHolder(parent,viewType);            case HomeFourthViewBean.TYPE:                homeFourthItemAdapterImpl = new HomeFourthRecycleAdapterImpl(list,context);                return homeFourthItemAdapterImpl.onCreateViewHolder(parent,viewType);            case CareFirstViewBean.TYPE:                careFirstRecycleAdapterImpl = new CareFirstRecycleAdapterImpl(list,context);                return careFirstRecycleAdapterImpl.onCreateViewHolder(parent,viewType);        }        return null;    }

4.写出onBindViewHolder方法 这里也要用到RecycleAdapterImpl类了,这个辅助类根据holder的类型使用响应类的方法 因为holder是由RecycleAdapterImpl类生成的所以很容易找到响应的方法

    //绑定数据,即绑定子空间中的数据    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        //instanceof功能 holder是否是HomeSecondItemAdapterImpl.HomeSecondViewHolder类的实例        //找了这个功能好久....        //根据holder 匹配   数据设置        if (holder instanceof HomeFirstRecycleAdapterImpl.HomeFirstViewHolder){            homeFirstItemAdapterImpl.onBindViewHolder(holder, position);        }else if (holder instanceof HomeSecondRecycleAdapterImpl.HomeSecondViewHolder) {            homeSecondItemAdapterImpl.onBindViewHolder(holder, position);        }else if (holder instanceof HomeThirdRecycleAdapterImpl.HomeThirdViewHolder) {            homeThirdItemAdapterImpl.onBindViewHolder(holder,position);        }else if (holder instanceof HomeFourthRecycleAdapterImpl.HomeFourthViewHolder) {            homeFourthItemAdapterImpl.onBindViewHolder(holder,position);        }else if (holder instanceof CareFirstRecycleAdapterImpl.CareFirstViewHolder) {            careFirstRecycleAdapterImpl.onBindViewHolder(holder,position);        }    }

5.写出getItemCount()

    //返回数据的大小    @Override    public int getItemCount() {            return list.size();            }

6.重写getItemViewType 这个结果会被 使用到onCreateViewHolder(ViewGroup parent, int viewType) 的viewType上

//这里重写 而不是实现抽象方法 返回的东西用在 onCreateViewHolder 里的viewType参数@Overridepublic int getItemViewType(int position) {    return list.get(position).getType();}

7.这是代码

package pers.lijunxue.tianmao.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.ViewGroup;import java.util.List;import pers.lijunxue.tianmao.javabean.CareFirstViewBean;import pers.lijunxue.tianmao.javabean.HomeFirstViewBean;import pers.lijunxue.tianmao.javabean.HomeFourthViewBean;import pers.lijunxue.tianmao.javabean.HomeSecondViewBean;import pers.lijunxue.tianmao.javabean.HomeThirdViewBean;import pers.lijunxue.tianmao.javabean.ViewBean;  Created by rabook on 2016/10/20.public class RecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {        private List<ViewBean> list;        private Context context;        //这里放可能要用到的Adapter        private HomeFirstRecycleAdapterImpl homeFirstItemAdapterImpl;        private HomeSecondRecycleAdapterImpl homeSecondItemAdapterImpl;        private HomeThirdRecycleAdapterImpl homeThirdItemAdapterImpl;        private HomeFourthRecycleAdapterImpl homeFourthItemAdapterImpl;        private CareFirstRecycleAdapterImpl careFirstRecycleAdapterImpl;        public RecycleAdapter(List<ViewBean> list, Context context){                this.list=list;                this.context = context;         }        绑定item布局文件,然后在内部类ViewHolder中绑定item布局文件中的子控件        @Override        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            //根据类型实力化Adapter            switch (viewType)            {                case HomeFirstViewBean.TYPE:                    homeFirstItemAdapterImpl = new HomeFirstRecycleAdapterImpl(list,context);                    return homeFirstItemAdapterImpl.onCreateViewHolder(parent,viewType);                case HomeSecondViewBean.TYPE:                    homeSecondItemAdapterImpl = new HomeSecondRecycleAdapterImpl(list,context);                    return homeSecondItemAdapterImpl.onCreateViewHolder(parent,viewType);                case HomeThirdViewBean.TYPE:                    homeThirdItemAdapterImpl = new HomeThirdRecycleAdapterImpl(list,context);                    return homeThirdItemAdapterImpl.onCreateViewHolder(parent,viewType);                case HomeFourthViewBean.TYPE:                    homeFourthItemAdapterImpl = new HomeFourthRecycleAdapterImpl(list,context);                    return homeFourthItemAdapterImpl.onCreateViewHolder(parent,viewType);                case CareFirstViewBean.TYPE:                    careFirstRecycleAdapterImpl = new CareFirstRecycleAdapterImpl(list,context);                    return careFirstRecycleAdapterImpl.onCreateViewHolder(parent,viewType);            }            return null;        }        绑定数据,即绑定子空间中的数据        @Override        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {            instanceof功能 holder是否是HomeSecondItemAdapterImpl.HomeSecondViewHolder类的实例            找了这个功能好久....            根据holder 匹配   数据设置            if (holder instanceof HomeFirstRecycleAdapterImpl.HomeFirstViewHolder){                homeFirstItemAdapterImpl.onBindViewHolder(holder, position);            }else if (holder instanceof HomeSecondRecycleAdapterImpl.HomeSecondViewHolder) {                homeSecondItemAdapterImpl.onBindViewHolder(holder, position);            }else if (holder instanceof HomeThirdRecycleAdapterImpl.HomeThirdViewHolder) {                homeThirdItemAdapterImpl.onBindViewHolder(holder,position);            }else if (holder instanceof HomeFourthRecycleAdapterImpl.HomeFourthViewHolder) {                homeFourthItemAdapterImpl.onBindViewHolder(holder,position);            }else if (holder instanceof CareFirstRecycleAdapterImpl.CareFirstViewHolder) {                careFirstRecycleAdapterImpl.onBindViewHolder(holder,position);            }        }        返回数据的大小        @Override        public int getItemCount() {                return list.size();                }    这里重写 而不是实现抽象方法 返回的东西用在 onCreateViewHolder 里的viewType参数    @Override    public int getItemViewType(int position) {        Log.d("getItemViewType","--------------list.get(position).getType()-------"+list.get(position).getType());        return list.get(position).getType();    }}

三.写出RecycleAdapterImpl类

1.onCreateViewHolde中要在view里加入布局

返回HomeThirdViewHolder类的实例

2.HomeThirdViewHolder 构造函数 用于绑定布局各个控件到自己类的属性

3.HomeThirdViewHolder中onBind()方法 对属性进行初始化 赋值

4.onBindViewHolder()方法调用onBind()就可以

package pers.lijunxue.tianmao.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.squareup.picasso.Picasso;import java.util.List;import pers.lijunxue.tianmao.R;import pers.lijunxue.tianmao.javabean.HomeThirdViewBean;import pers.lijunxue.tianmao.javabean.HomeThirdViewItemBean; 适配 title 加3图片 与 4型有区别 Created by rabook on 2016/10/25.public class HomeThirdRecycleAdapterImpl extends BaseRecycleAdapter {    private LayoutInflater layoutInflater;    public HomeThirdRecycleAdapterImpl(List list, Context context) {        super(list, context);    }    @Override    RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        layoutInflater = LayoutInflater.from(parent.getContext());        View view = layoutInflater.inflate(R.layout.home_item_card_view_three, parent, false);        return new HomeThirdViewHolder(view);    }    @Override    void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        HomeThirdViewHolder homeThirdViewHolder = (HomeThirdViewHolder)holder;        homeThirdViewHolder.onBind(super.getList(),position,super.getContext());    }     绑定item布局文件中的子控件 监听动作    class HomeThirdViewHolder extends RecyclerView.ViewHolder {        private HomeThirdViewBean homeThirdViewBean;        private HomeThirdViewItemBean [] items ;        private TextView title ;        private ImageView[] images;        private int [] imgview_ids = {                R.id.imgview_big,                R.id.imgview_small_top,                R.id.imgview_small_bottom        };        public HomeThirdViewHolder(View itemView) {            super(itemView);            items = new HomeThirdViewItemBean[3];            images = new ImageView[3];            title = (TextView) itemView.findViewById(R.id.text_title);            for (int i = 0;i < images.length ; i++) {                images[i] = (ImageView) itemView.findViewById(imgview_ids[i]);            }        }        public void onBind(List list , int position, Context context){            homeThirdViewBean =  (HomeThirdViewBean)list.get(position);            items [0] = homeThirdViewBean.getCpOne();            items [1] = homeThirdViewBean.getCpTwo();            items [2] = homeThirdViewBean.getCpThree();            for (int i = 0; i<items.length;i++) {                ImageView imageView = images[i];                //使用网络图片                Picasso.with(context).load(items[i].getImgUrl()).into(imageView);                title.setText(homeThirdViewBean.getTitle());            }        }    }}

四.在Fragment调用RecyclerView的代码

    /**     * 初始化 initRecyclerView 基本设置     * @param view     */    private void initRecyclerView(View view) {        recyclerView= (RecyclerView) view.findViewById(R.id.recycler_view);        recycleAdapter =new RecycleAdapter(recycleList,getContext());        //加载adapter        recyclerView.setAdapter(recycleAdapter);        //必须写才能出现recyclorView 也可以是GirdLayoutManager,只是显示item的图形不一样        recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));        //这里设置了自定义分割线  自定义分割线的类继承了RecyclerView.ItemDecoration        recyclerView.addItemDecoration(new HomeItemDecoration());    }
0 0