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

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

一.先写一个基础类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参数
@Override
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值