ListView的高级封装

来源:互联网 发布:壮游科技和塔人网络 编辑:程序博客网 时间:2024/06/05 01:10

 

需求:当程序中有大量的listView时封装能大大减少代码的书写量。

思路:抽取不变的方法,将不变的交给子类实现

步骤:先将普通的代码写出来,不断抽象,解决不掉的,交给抽象方法。

代码:

 

Adapter的封装:

public abstractclass MyBaseAdapter<T> extends BaseAdapter {

        

         privateArrayList<T> list;

         privateContext context;

        

         //需要数据

         //需要context对象

         publicMyBaseAdapter(ArrayList<T> list,Context context) {

                  this.list= list;

                  this.context= context;

         }

 

         @Override

         publicint getCount() {//返回item的数量

                  returnlist.size();

         }

 

         @Override

         publicT getItem(int position) {//返回具体item上的数据或者对象

                  returnlist.get(position);

         }

 

         @Override

         publiclong getItemId(int position) {//返回item的id

                  returnposition;

         }

 

         @Override                        //返回具体item的布局对象

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

                 

                  BaseHolderholder;

                  if(convertView==null) {

                          holder= getHolder(context);//获取布局对象

                          convertView= holder.getRootView();

                  }else{

                          holder= (BaseHolder) convertView.getTag();

                  }

                 

                  //给对应的item设值

                  holder.setData(getItem(position));

                 

                  returnconvertView;

         }

 

         publicabstract BaseHolder<T> getHolder(Context context);

}


ViewHolder的封装:

public abstractclass BaseHolder<T> {

         privateView mRootView;// 是每个item的布局

         privateT data;

 

         publicBaseHolder(Context context) {

                  mRootView= initView(context);

                  mRootView.setTag(this);//③设置tag

         }

 

         //①加载布局,②findViewById(),不知道具体对象,交给子类实现

         publicabstract View initView(Context context);

 

         //将item对象返回

         publicView getRootView() {

                  returnmRootView;

         }

 

         //④设置数据,具体交给子类

         publicabstract void refreshData(T data);

 

         //接收数据,才能将数据设置给对应item

         publicvoid setData(T data) {

                  this.data= data;

                  refreshData(data);

         }

 

         //将对应item的数据暴露出去,以便使用

         publicT getData() {

                  returndata;

         }

}


子类必须实现布局和数据设置:

public classViewHolder extends BaseHolder<String> {

 

         publicViewHolder(Context context) {

                  super(context);

         }

 

         @Override

         publicView initView(Context context) {//必须由子类实现

                 

                  returnnull;

         }

 

         @Override

         publicvoid refreshData(String data) {//设置数据,必须由子类实现

                 

         }

}


0 0
原创粉丝点击