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

来源:互联网 发布:成都市有几个行知小学 编辑:程序博客网 时间:2024/06/05 11:13

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