listview baseadapter优化

本文详细介绍了Android中ListView组件的使用方法,特别是如何通过BaseAdapter自定义适配器以提高性能。文章首先概述了BaseAdapter的基本实现步骤,包括getCount(), getItem(), getItemId()和getView()等关键方法的作用及实现方式;随后深入探讨了ListView优化技巧,通过复用convertView来减少内存消耗。
摘要由CSDN通过智能技术生成

Listview

一、Listview使用baseadapter

a) 实现一个类,继承自baseadapter,并且实现了它所要求实现的方法

b) getCount()这是执行listview最先加载的内容,如果是0则意味着这个listview是不会显示数据的,所以只要你想显示数据你就的加载。

c) getItem()getItemId()都不是很重要的方法

d) getView(positionconvertViewparent)第一个position表示加载的是第position上的数据(相对于显示出来的数据列表中的第几项)convertview旧视图,实际上就是一个view对象,因此你可以利用它就没必要另外创建一个新对象了,parent你的listview所在的那个context,也就是它的父view中。

e) 最简单的实现-->设置它的count10,在getview中,先通过layoutinflater加载xml,得到view对象,然后通过view对象的findwaybyid获取我们想要的控件,再给控件设置值就可以了。

Context c;

public myadapter(Context c){

this.c=c;

}

//设置大小

public int getCount() {

return 10;

}

public Object getItem(int p) {

return p;

}

public long getItemId(int p) {

return p;

}

public View getView(int p, View v, ViewGroup vg) {

//获取控件,加载内容就可以了,十分简单

        //获取一个layoutinflater,用于将一个xml加载成为一个view对象

LayoutInflater layout=(LayoutInflater)   c.getSystemService(c.LAYOUT_INFLATER_SERVICE);

v=layout.inflate(R.layout.show_listview,null);

ImageView iv2=(ImageView)v.findViewById(R.id.iv2);

TextView tv2=(TextView)v.findViewById(R.id.tv2);

tv2.setText("current is "+p);

return v;

}

二、Listview的优化

a) Baseadapter对象的getview方法的第二个参数counvertview是表示一个已经显示过的view视图,意思就是哪个视图已经在屏幕中出现过,并且现在已经不能在屏幕中看到(完全看不到),那么每当这样的view消失一个(实际上是放入回收)我们的第二个参数就会捕获,并等于最新移出去的那个view。如果你不明白的话,请看它的具体原理(http://write.blog.csdn.net/postlist)

b) 实现构思:我们可以只构造一个屏幕的view对象,那么当新有view要进来的时候,势必会有一个要出去,我们更改出去的那个view的内容,让他等于新进来的这个即可。当然,可能你会考虑出现位置的问题,实际上它是由geteview的方法已经确定了一个position,所以不需要关心。

c) 具体实现:

        注意:前提是listview的属性设置的是match-parent或者fill-parent,否则将会是另  外一种情况。

Context c;

public myadapter2(Context c){

this.c=c;

}

public int getCount() {

return 20;

}

public Object getItem(int position) {

return null;

}

public long getItemId(int position) {

return 0;

}

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

LayoutInflater layout=(LayoutInflater) c.getSystemService(c.LAYOUT_INFLATER_SERVICE);

mytag mt=null;

System.out.println("v="+v);

if(v==null){

//来自于创建

mt=new mytag();

View v2;

v2=layout.inflate(R.layout.show_listviewnull);

mt.tv=(TextView)v2.findViewById(R.id.tv2);

mt.tv.setText(position+"");

        v2.setTag(mt);

        return v2;

}else{

//System.out.println("来自于垃圾");

    mt=(mytag)v.getTag();

}

mt.tv.setText(position+"");

return v;

}

class mytag{

//这样的数据没法赋值吗,可以通过findwaybyid来赋值

public ImageView iv;

public TextView tv;

}

d) 查看输出我们就可以看到,刚开始的时候,我们的v有几个null,这取决于你屏幕第一次显示出了多少个view对象(注意:只显示一部分的也算),然后,当你滑动屏幕的时候,你可以通过输出看出我们的v并不是空的了,因此,它实际上就使用了已经存在的v对象进行了操作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值