从开始学习封装,就是仿照慕课网某视频学习的。这才过去半年,自己也有思路了,现在把我的封装代码贴出来,给初学者一点帮助吧。有任何问题,请联系我。
/**
* 描述:单布局适配器基类
* author SunXiaoGang
* E-mail sunxiaogang0214@163.com
* Created by SunXiaoGang on 16/9/23.
*/
public abstract class BasicAdapter<T,V> extends BaseAdapter {
protected List<T> list;
protected Context context;
// TODO: 16/9/23 正式环境 换0
@Override
public int getCount() {
return list == null ? 0 : list.size();
}
@Override
public T getItem(int position) {
T t = null;
if (list != null) {
t = list.get(position);
}
return t;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
V baseHolder;
if (context == null) {
context=parent.getContext();
}
if (convertView == null) {
baseHolder = getBaseHolder();
convertView = LayoutInflater.from(context).inflate(getLayoutId(), null);
convertView.setTag(baseHolder);
x.view().inject(baseHolder,convertView);
//其他处理
otherHandle(baseHolder);
} else {
baseHolder= (V) convertView.getTag();
}
T bean=null;
if (list != null) {
bean=list.get(position);
}
bindView(position,convertView,parent,baseHolder,bean);
return convertView;
}
/**
*
* @return BaseHolder
*/
protected abstract V getBaseHolder();
/**
* 绑定控件
* @param position position
* @param convertView convertView
* @param parent parent
* @param mHolder holder
*/
protected abstract void bindView(int position, View convertView, ViewGroup parent,V mHolder,T bean);
/**
* 其他处理
*/
protected void otherHandle(V holder) {
}
/**
*
* @return Layout Id
*/
protected abstract int getLayoutId();
//其他共有方法
public void addList(List<T> var) {
if (isListEmpty(var)) {
return;
}
if (isListEmpty(list)) {
this.list = var;
} else {
this.list.addAll(var);
}
notifyDataSetChanged();
}
/**
* 页面跳转
* @param intent
*/
protected void startActivity(Intent intent) {
context.startActivity(intent);
}
/**
* 判断List是否为空
* @param var list对象
* @return true or false
*/
private boolean isListEmpty(List var) {
if (var == null || var.size() == 0) {
return true;
}
return false;
}
//各种set和get方法
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
notifyDataSetChanged();
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
/**
* View点击事件,做页面跳转 包括item点击事件
*/
public void viewOnClickIntent(View view, final Intent intent) {
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent);
}
});
}
}```
先简单说下吧。这两个泛型:T 数据源泛型(传实体的) V:ViewHolder泛型(本项目使用注解,如果不使用注解,ViewHolder的构造应该传入convertView,同样的`/**
* 其他处理
*/
protected void otherHandle(V holder) {
}`这个代码应该改为`/**
* 其他处理
*/
protected void otherHandle(View convertView,V holder) {
}`这样,在这个方法里各种findViewById),至于这些代码` /**
* 页面跳转
* @param intent
*/
protected void startActivity(Intent intent) {
context.startActivity(intent);
}
/**
* 判断List是否为空
* @param var list对象
* @return true or false
*/
private boolean isListEmpty(List var) {
if (var == null || var.size() == 0) {
return true;
}
return false;
}
/**
* View点击事件,做页面跳转 包括item点击事件
*/
public void viewOnClickIntent(View view, final Intent intent) {
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent);
}
});
}`是项目能使用到的一些小的工具,能用用,不能用就删
具体使用
创建一个数据实体
/**
* 描述:测试实体
* author SunXiaoGang
* E-mail sunxiaogang0214@163.com
* Created by SunXiaoGang on 16/10/12.
*/
public class TextBean {
}
和一个Adapter的内部类
public class TextHolder {
}
<P>为什么要使用内部类? 方便。</p>
传入Adapter的泛型,如下:
/**
* 描述:
* author SunXiaoGang
* E-mail sunxiaogang0214@163.com
* Created by SunXiaoGang on 16/10/12.
*/
public class TextAdapter extends BasicAdapter
然后添加需要重写的抽象方法结果如下:
/**
* 描述:
* author SunXiaoGang
* E-mail sunxiaogang0214@163.com
* Created by SunXiaoGang on 16/10/12.
*/
public class TextAdapter extends BasicAdapter
最后完善,设置布局id和new新的Holder,最终代码如下:
/**
* 描述:
* author SunXiaoGang
* E-mail sunxiaogang0214@163.com
* Created by SunXiaoGang on 16/10/12.
*/
public class TextAdapter extends BasicAdapter
最后在
@Override
protected void bindView(int position, View convertView, ViewGroup parent, TextHolder mHolder, TextBean bean) {
}
做各种绑定事件,好了,完结了。以上代码复制就能用,如果不使用注解模块,在BasicAdapter的getView()方法里去掉这一句代码
x.view().inject(baseHolder,convertView);
然后重写
/**
* 其他处理
*/
protected void otherHandle(V holder) {
}
在这里findViewById,把上面那个方法替换成下面的方法
/**
* 其他处理
*/
protected void otherHandle(View convertView,V holder) {
}
并且修改getVIew()里面的
//其他处理
otherHandle(baseHolder);
为
//其他处理
otherHandle(convertView,baseHolder);
“`
完结,有问题请回复。