Listview
一、Listview使用baseadapter
a) 实现一个类,继承自baseadapter,并且实现了它所要求实现的方法
b) getCount()这是执行listview最先加载的内容,如果是0则意味着这个listview是不会显示数据的,所以只要你想显示数据你就的加载。
c) getItem(),getItemId()都不是很重要的方法
d) getView(position,convertView,parent)第一个position表示加载的是第position上的数据(相对于显示出来的数据列表中的第几项)convertview旧视图,实际上就是一个view对象,因此你可以利用它就没必要另外创建一个新对象了,parent你的listview所在的那个context,也就是它的父view中。
e) 最简单的实现-->设置它的count为10,在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_listview, null); 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对象进行了操作