Listview的BaseAdapter封装讲解

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载,违者必究。 https://blog.csdn.net/Cricket_7/article/details/89003016

1,RecyclerView的出现其实替代了ListView ,查看RecyclerView  源码,简单的利用面向对象的思想进行封装BaseAdapter

  • 对getCount,getItem,getItemId进行抽取封装 

  • getCount需要一个数据进行展示,我们不知道传入什么样的数据,List<T> 泛型来确认,通过构造方法来确认

public abstract class MyBaseAdapter <T> extends BaseAdapter{

    private List<T> mList;

    private BaseHolder holder;





    public MyBaseAdapter(List<T> list) {

        this.mList = list;

    }





    @Override

    public int getCount() {

        return mList.size();

    }





    @Override

    public T getItem(int position) {

        return mList.get(position);

    }





    @Override

    public long getItemId(int position) {

        return position;

    }

【2】难点,getView 方法的填充

public abstract class BaseHolder<T>{





    private final View convertView;

    private T mData;





    //1.等同于getView方法中的new ViewHolder()

    public BaseHolder(){

        //2.将listView一个条目的布局文件转换成view对象

        convertView = initView();

        //3.等同于convertView.setTag(viewHolder)

        convertView.setTag(this);

    }

    //此方法等价于,getView方法中将数据放置到控件中去的方法

    //1.数据类型未知,不同的数据适配器,一个条目的javabean对象,有差异

    //2.控件有什么未知,每一个ListView一个条目的布局文件都不一样,所以拥有的控件不一致

    public void setData(T data){

        this.mData = data;

        bindData();

    }

    public T getData(){

        return mData;

    }





    public View getConvertView(){

        return convertView;

    }

    protected abstract void bindData();

    //listView的数据适配器,作为基类去使用,每一个listView一个条目的布局都是有差异的,所以此次无法编写具体

    //xml--->view方法,既不能实现View.inflate(布局)方法

    protected abstract View initView();

}



【3】getView在MyBaseAdapter中的调用BaseHolder

public abstract class MyBaseAdapter <T> extends BaseAdapter{

    private List<T> mList;

    private BaseHolder holder;



    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView == null){

            //调用baseHolder的构造方法

            holder = getHolder();

        }else{

            holder = (BaseHolder) convertView.getTag();

        }

        holder.setData(mList.get(position));

        return holder.getConvertView();

    }





    protected abstract BaseHolder getHolder() ;

}



2,调用流程

【1】,实现效果

  • listview 使用我们自己封装的Adapter

  • 简单展示一个textview  数据

【2】,实现逻辑

  • 创建适配器

    

class HomeAdapter extends MyBaseAdapter {

        public HomeAdapter(List list) {

            super(list);

        }





        @Override

        protected BaseHolder getHolder() {

            return new HomeHolder();

        }

    }
  • 创建需要添加的View

知识越学,总结就是父类无法完成的直接abstract 一个方法具体内容叫子类自己去完成。不确认的是什么返回类型有T泛型代替,多写,多练。还有给点个赞吧。哈哈哈哈哈

猜你喜欢

转载自blog.csdn.net/Cricket_7/article/details/89003016