关于Android自定义适配器BaseAdapter浅谈

最近学习了适配器,下面就代码实现和性能优化,谈一下自己的学习心得:

Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View;

Android中有个叫做Recycler的构件,如果你有100个item,其中只有可见的项目存在内存中,其他的在Recycler中。

当item1滚出屏幕,并且一个新的item从屏幕底端上来时,ListView再请求一个type1视图,convertView此时不是空值了,它的值是item1。你只需设定新的数据,然后返回convertView,不必重新创建一个视图。

ListView先请求一个type1视图(getView),然后请求其他可见的item,convertView在getView中是空(null)的。


第一步:直接上例子:

在这里我的

//这是我的主界面,定义了几个用于适配器使用的资源

public class MainActivity extends Activity {

private static String []names = {"苹果","青葡萄","葡萄","瓜","小草","君子兰","千锋"};//名字
private statuc  int []icons = {R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04,R.drawable.img05,R.drawable.img06,R.drawable.img07};//图片

private ListView listIView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);

listView = (ListView) this.findVIewById(R.id.listview);

//实例化一个适配器

MyAdapter  adapter = new MyAdapter (this);

//显示
listView.setAdapter(adapter);
}

}

//自定义适配器

public class MyAdapter extends BaseAdapter{
private Content content;

public MyAdapter(Content content){

this.content = content;

}

@Override
public int getCount() {
return names.length;
}


@Override
public Object getItem(int position) {
return icons[position];
}


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

//优化代码、提高加载效率 核心代码
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyHolder myHolder;

//当缓存中的没有view时先实例化一个“盒子--MyHolder”用于存放item中的控件
if(convertView==null){
myHolder = new MyHolder();//实例化一个“盒子--MyHolder”
convertView = LayoutInflater.from(content).inflate(R.layout.layout_homework_02_next_gridview, null);//加载用于Adapter布局的资源即item项View
myHolder.icon = (ImageView) convertView.findViewById(R.id.icon);//分别获得item布局中的控件,并存放在“盒子中”,以便重复使用
myHolder.name = (TextView) convertView.findViewById(R.id.name);
convertView.setTag(myHolder);//将“盒子”存放在convertView中,用于重复循环使用,重构新的item显示项
}else{
myHolder = (MyHolder) convertView.getTag();//convertView不为空时,直接使用
}
myHolder.icon.setImageResource(MainActivity .icons[position]);
myHolder.name.setText(MainActivity .names[position]);
return convertView;//在此,要注意返回的值
}

//自定义内部类用于存放Item中的控件
class MyHolder{
TextView name;
ImageView icon;
}
}


【性能优化】

对于性能优化,简单谈几点:

当ListView需要加载的数据非常大的时候,对于手机的内存是要分担很大负担的,所以性能优化十分重要

1.android:layout_height属性:

布局高度属性设置为非“wrap_content”(可以是“match_parent /  fill_parent  /  ***dp等绝对数值”)

2.ViewHolder:

利用ViewHolder内部类,将item布局文件中需要展示的控件定义为属性(其实ViewHolder就是一个自定义的模型类)。这样就把item中散在的多个控件合成一个整体,这样可以有效地避免图片错位

3.convertView:

 ListView的加载是一个item一个item的加载,这样就会每次都inflate一个item布局,然后findViewById一遍该布局上的所有控件。当数据量大的时候,是不可想象的。而利用Recycle回收利用就可以解决问题。所以要善于重复利用convertView,这样可以减少填充布局的过程,减少ViewHolder对象实例化的次数。减少内存开销,提高性能。

4.convertView的setTag():

利用setTag()方法将ViewHolder对象作为标签附加到convertView上,当convertView被重复利用的时候,因为上面有ViewHolder对象,所以convertView就具有了ViewHolder中的几个属性,这样就节省了findViewById()这个过程。如果一个item有三个控件,如果有100条item,那么在加载数据过程中,就就相当于节省了几百次findViewById(),节约了执行findViewById()的时间,提升了加载速度,节省了性能的开销。


洋洋洒洒,唠叨了那么多,如果众神发现小编存在十分愚笨或者可笑的错误,再次希望您及时指正,以免误人子弟。。。








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值