版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载,违者必究。 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泛型代替,多写,多练。还有给点个赞吧。哈哈哈哈哈