您的位置:首页 > 移动开发 > Android开发

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

2016-12-12 22:04 316 查看
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滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android mvc
相关文章推荐