Android课堂笔记——BaseAdapter及其优化

BaseAdapter概述:
BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter,在MVC框架中,担任适配器的角色

*注 控制器:是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

需要重写的四个方法
使用BaseAdapter必须写一个类继承它,同时BaseAdapter是一个抽象类,继承它必须实现它的方法。BaseAdapter的灵活性就在于它要重写很多方法
需要重写的方法如下:

1.getCount() 我们将要绘制的资源数。
2.getView() 通过传入的参数position,加工成我们想要的View并返回,最终供GridView使用
3.getItemId() 该方法的返回值决定第position处的列表项的ID,某些方法(如onclicklistener的onclick方法)有id这个参数,而这个id参数就是取决于getItemId()这个返回值的。
4.getItem() getItem方法不是在Baseadapter类中被调用的,而是在Adapterview.getItemAtPosition(position) 中被调用的。getItemAtPosition(position) 是在setOnItemClickListener、setOnItemLongClickListener、setOnItemSelectedListener的点击选择处理事件中方便地调用来获取当前行数据的。

其中getView方法是最为重要的一个方法,并且会涉及到程序优化的问题,这样将会大大的提高代码的执行效率,从而加强程序的用户体验,而大部分的优化都是从对getView方法不同方式的重写而体现的,这里有三种方法重写getView,分别对这个方法有不同程度的优化。

方法一:完全没有任何的优化

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

     int num =list.get(position); 
     View view = View.inflate(context,R.layout.myitem, null);
     TextView textView = (TextView) view.findViewById(R.id.tv);
     textView.setText(num + "");
     return view;
    }

方法二:普通的优化

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

          int num=list.get(position);
if (convertView == null) { convertView = View.inflate(context,
          R.layout.myitem, null);
    } 
         TextView textView=(TextView)convertView.findViewById(R.id.tv);
          textView.setText(num+"");
          return convertView;

这个方法主要运用了ConvertView回收机制来减少方法的多次调用,减少了方法一View view = View.inflate(context,R.layout.myitem, null);这段代码的重复使用,从而对方法进行了优化,但是优化不彻底,findViewById还是会次次执行。

方法三:最终版本的优化

public View getView(int position, View convertView, ViewGroup parent) {
        int num = list.get(position);// 2
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.myitem, null);
            viewHolder = new ViewHolder();
            viewHolder.textView = (TextView) convertView.findViewById(R.id.tv);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.textView.setText(num + "");
        return convertView;
    }

    // 起到缓存作用的类ViewHolder
    static class ViewHolder {
        TextView textView;
    }

}

这段代码处理利用了ConvertView回收机制并且同时也使用了ViewHolder来减少findViewById的执行次数,从而达到最终的优化。

ViewHolder类:通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值