ps:listview中有一些简单使用的适配器,如:simpleadapter:构造方法simpleadapter(context context,list<map<string,?>> data,restring [] from,int [] to),但这种适配器过于单调,往往不能达到用户想要的效果,想要随心所欲,就用到了baseadapter,自定义适配器。
如图:
1、首先写布局文件
activity_layout.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <listview android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/id_lv"> </listview> </linearlayout>
没一个item的样式:itemstyle_layout.xml 其中的图片自己随便找个即可。
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="match_parent"> <imageview android:layout_width="70dp" android:layout_height="80dp" android:src="@drawable/tou"/> <linearlayout android:layout_width="0dp" android:layout_weight="0.9" android:layout_height="80dp" android:orientation="vertical"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:textsize="35dp" android:text="11111" android:id="@+id/id_item_tv"/> <textview android:layout_margintop="5dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:textsize="20dp" android:text="11111" android:id="@+id/id_item_tv2"/> </linearlayout> <linearlayout android:layout_width="0dp" android:layout_height="80dp" android:layout_weight="0.1" android:orientation="vertical"> <imageview android:layout_width="match_parent" android:layout_height="50dp" android:src="@drawable/xin1"/> </linearlayout> </linearlayout>
2、创建适配器myadapter.java (已优化)
申明一点,适配中有优化方法,如果不优化的话,有时也可以加载出来,但有时就会加载错乱,没调用一次就会多浪费创建一个view对象,如:
view item = layoutinflater.from(context).inflate(r.layout.itemstyle_layout, null); // textview info = (textview)item.findviewbyid(r.id.id_item_tv); // info.settext(list.get(position)+"");
优化后(加入了viewholder)
public class myadapter extends baseadapter{ // public list<map<string,string>> list; public context context; public myadapter (context context,list<map<string,string>> list){ this.context=context; this.list=list; }
@override public int getcount() { return list.size();//返回个数 } @override public object getitem(int position) { return list.get(position);//返回项 } @override public long getitemid(int position) { return position;//角标 } @override public view getview(int position, view convertview, viewgroup parent) { // view item = layoutinflater.from(context).inflate(r.layout.itemstyle_layout, null); // textview info = (textview)item.findviewbyid(r.id.id_item_tv); // info.settext(list.get(position)+""); viewholder viewholder; if(convertview ==null){ viewholder= new viewholder(); convertview=layoutinflater.from(context).inflate(r.layout.itemstyle_layout,null);//加载布局 viewholder.tv1= (textview) convertview.findviewbyid(r.id.id_item_tv); viewholder.tv2= (textview) convertview.findviewbyid(r.id.id_item_tv2); convertview.settag(viewholder); }else{ viewholder= (viewholder) convertview.gettag(); } viewholder.tv1.settext(list.get(position).get("tv1")+""); viewholder.tv2.settext(list.get(position).get("tv2")+""); return convertview; } static class viewholder { imageview iv; textview tv1; textview tv2; }
3、在mainactivity.java中加载listview控件并把list赋值。
public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); listview lv= (listview) findviewbyid(r.id.id_lv); list<map<string,string>> list=new arraylist<map<string,string>> (); for(int i=0;i<10;i++){ map<string,string> map=new hashmap<>(); map.put("tv1","111111"); map.put("tv2","222222"); list.add(map); } myadapter ma=new myadapter(this,list); lv.setadapter(ma); } }
完事。
总结:代码优化加入viewholder的好处:(官方翻译)
重用缓存convertview传递给getview()方法来避免填充不必要的视图
使用viewholder模式来避免没有必要的调用findviewbyid():因为太多的findviewbyid也会影响性能
viewholder模式通过getview()方法返回的视图的标签(tag)中存储一个数据结构,这个数据结构包含了指向我们要绑定数据的视图的引用,从而避免每次调用getview()的时候调用findviewbyid())。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
LongClick原理、上下文菜单原理、EditText长按弹窗原理、WebView长按弹窗自定义、修复WebView全选重复bug ———————————————— 版权声明:本文为CSDN博主「
JobScheduler 实现 特定时间,特定条件(系统空闲,电池电量,磁盘空间 ……)下执行任务
温习Android基础知识——《第一行代码(第三版)》读书笔记 Chapter 10 Service
网友评论