在日常开发中,经常会使用到listview,在使用listview的时候肯定会涉及到adapter的使用,如果每次使用一次就建立一个新的adapter这样就会造成代码的冗余,会多写很多没有必要的代码,在使用的时候应根据自己的需要进行封装,可以定义个DefaultAdapter去继承BaseAdapter,将有共性的代码写在这里面,不存在共性的使用抽象法让继承DefaultAdapter类去实现;同时定义一个抽象的BaseHolder让需要的类出实现它,具体代码如下:
/**
* viewholder基类,后面的viewholder可以继承该类
* @author Administrator
*
* @param <Data>
*/
public abstract class BaseHolder<Data> {
private View convertView;
private List<Data> list;
private int pos;
public BaseHolder() {
convertView=initView();
convertView.setTag(this);
}
public View getConvertView() {
return convertView;
}
@SuppressWarnings("unchecked")
protected <T extends View> T findID(View v, int id) {
return (T) v.findViewById(id);
}
public void setData(List<Data> list,int pos) {
this.list = list;
this.pos=pos;
refreshView(list,pos);
}
public abstract void refreshView(List<Data> list,int pos);//初始化页面数据
public abstract View initView();//加载页面ui
}
/**
* 适配器基类,后面的适配器可以继承该类
* @author Administrator
*
* @param <Data>
*/
public abstract class DefaultAdapter<Data> extends BaseAdapter {
private Context context;
protected List<Data> list;
public DefaultAdapter(Context context,List<Data> list){
this.context = context;
this.list = new ArrayList<Data>();
if(list!=null)
{
this.list.addAll(list);
}
}
public List<Data> getDatas() {
return list;
}
public void setDatas(List<Data> list) {
this.list = list;
}
public void nodfiyData(List<Data> list){
if(list!=null)
{
this.list.clear();
this.list.addAll(list);
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return list == null ? 0 : list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressWarnings("unchecked")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder<Data> holder=null;
if (convertView==null) {
holder=getHolder();
}else{
holder=(BaseHolder<Data>) convertView.getTag();
}
if (position<list.size()) {
holder.setData(list,position);
}
refreshUi(holder.getConvertView(), position);
return holder.getConvertView();
}
protected abstract BaseHolder<Data> getHolder();
public abstract void refreshUi(View convertView,int position);//初始化页面数据
}
以上就是主要的代码封装,其实在BaseHolder中还定义了一个findID的方法,该方法用于在布局中通过id获取对应的控件,并返回该对象,其实现在也有很多大牛了一些注解,可以很方便的通过id获取对应的控件;包括在BaseActivity中采用的也是这样的处理方式;
@SuppressWarnings("unchecked")
protected <T extends View> T ID(int id) {
return (T) super.findViewById(id);
}
@SuppressWarnings("unchecked")
protected <T extends View> T ID(View v, int id) {
return (T) v.findViewById(id);
}
public class MainActivity extends BaseActivity {
private ListView listview;
private List<String> list=new ArrayList<String>();
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initView(){
listview=ID(R.id.listview);
adapter=new MyAdapter(MainActivity.this, list);
listview.setAdapter(adapter);
}
class MyAdapter extends DefaultAdapter<String>{
public MyAdapter(Context context, List<String> list) {
super(context, list);
}
@Override
protected BaseHolder<String> getHolder() {
return new MyHolder();
}
@Override
public void refreshUi(View convertView, int position) {
}
}
class MyHolder extends BaseHolder<String>{
TextView tv;
@Override
public void refreshView(List<String> list, int pos) {
String string = list.get(pos);
this.tv.setText(""+string);
}
@Override
public View initView() {
View convertView = View.inflate(MainActivity.this, R.layout.listview_item, null);
this.tv=findID(convertView, R.id.tv);
return convertView;
}
}
private void initData(){
for (int i = 0; i < 20; i++) {
list.add(""+i);
}
}
}
大致实现方式就是这样的,效果如下:
源码地址:http://download.csdn.net/detail/wangwo1991/9746772