BaseAdapter和Viewholder的抽取(模版设计模式)

为什么要抽取呢?

因为每次都要写重复的代码,写一次还好写多了,自然就不合适了

  1. 我们首先观察,每次都要进行一次设置个数啊,返回list的对应对象,判断不为空啊,如下所示:

 public int getCount() {
     if (mDatas != null) {
         return mDatas.size();
     }
     return 0;
 }

 public Object getItem(int position) {
     if (mDatas != null) {
         return mDatas.get(position);
     }
     return null;
 }

 public long getItemId(int position) {
     return position;
 }

  1. 我们发现可以把这三个方法抽取出来,放到一个我自己的BaseMyAdapter中

public class BaseMyAdapter extends BaseAdapter

  1. 可是我们接着又发现数据我们不知道如何获取到啊...

    每次当我们给listview等设置Adapter的时候都是要new出来,突然我发现可以在构造函数中设置数据,而类型我可以设置成泛型,BaseMyAdapter<T>类名也要加上泛型

暂时的BaseAdapter算是抽取结束了(暂时),同时我们发现每次都要定义ViewHolder类 这个我们可以抽取吗?(答案是可以的)
  1. 我们可以首先对这个主页的holder进行抽取,利用MAC思想,定义一个BaseHolder
  • 我们发现无非每次都是要获取view,并且添加进tag中

      public abstract class BaseHolder<T> {
    
          public View mRootView;
    
          public BaseHolder() {
              mRootView = initView();
              mRootView.setTag(this);
          }
    
          // 相当于我进行了初始化这个item的布局
          public abstract View initView();
    
          // 我要进行数据的添加和ui的更新
          public abstract void setDatasAndRefreshUI(T datas);
      }

    在这里我们知道到底要加载什么样item这个类并不知道,可是又要必须实现,我们则定义成抽象方法,让具体实现子类完成

  • 这时我们可以进行对BaseAdapter进一步的抽取

      public View getView(int position, View convertView, ViewGroup parent) {
              BaseHolder<T> holder = null;
              if (convertView == null) {
                  holder = getHolder();
              } else {
                  holder = (BaseHolder<T>) convertView.getTag();
              }
              // 添加数据,进行UI界面的刷新
              holder.setDatasAndRefreshUI(mDatas.get(position));
              return holder.mRootView;
          }
    
          public abstract BaseHolder<T> getHolder();

    因为具体要加载哪个view并不知道,这里我们设置成抽象方法,让具体的子类进行实现

  • 这时如果要继承BaseMyAdapter就会变成这个样子

      private class MyDatasAdapter extends BaseMyAdapter<String> {
          public MyDatasAdapter(List<String> mDatas) {
              super(mDatas);
          }
    
          public BaseHolder<String> getHolder() {
              return new HomeHolder();
          }
      }

    代码中具体的homeHolder如下:

  public class HomeHolder extends BaseHolder<String> {

      private TextView mTvtmp1;
      private TextView mTvtmp2;

      public HomeHolder() {
          super();
      }

      public View initView() {
          // 相当于我进行了初始化这个item的布局
          View mRootView = View.inflate(UIUtils.getContext(),
                  R.layout.item_temp_listview, null);
          mTvtmp1 = (TextView) mRootView.findViewById(R.id.item_temp_tv1);
          mTvtmp2 = (TextView) mRootView.findViewById(R.id.item_temp_tv2);
          return mRootView;
      }

      public void setDatasAndRefreshUI(String datas) {
          // 我要进行数据的添加和ui的更新
          mTvtmp1.setText("头" + datas);
          mTvtmp2.setText("尾巴" + datas);
      }
  }


  • 最终BaseHolder:

  public abstract class BaseHolder<T> {

      public View mRootView;

      public BaseHolder() {
          mRootView = initView();
          mRootView.setTag(this);
      }

      // 相当于我进行了初始化这个item的布局
      public abstract View initView();

      // 我要进行数据的添加和ui的更新
      public abstract void setDatasAndRefreshUI(T datas);
  }


  • 最终BaseMyAdapter:

  public abstract class BaseMyAdapter<T> extends BaseAdapter {

      private List<T> mDatas;

      /** 通过构造获取数据 */
      public BaseMyAdapter(List<T> mDatas) {
          this.mDatas = mDatas;
      }

      public int getCount() {
          if (mDatas != null) {
              return mDatas.size();
          }
          return 0;
      }

      @Override
      public Object getItem(int position) {
          if (mDatas != null) {
              return mDatas.get(position);
          }
          return null;
      }

      public long getItemId(int position) {
          return position;
      }

      public View getView(int position, View convertView, ViewGroup parent) {
          BaseHolder<T> holder = null;
          if (convertView == null) {
              holder = getHolder();
          } else {
              holder = (BaseHolder<T>) convertView.getTag();
          }
          // 添加数据,进行UI界面的刷新
          holder.setDatasAndRefreshUI(mDatas.get(position));
          return holder.mRootView;
      }

      public abstract BaseHolder<T> getHolder();
  }

转载需注明来源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值