一、直接使用listview组件创建
1.直接在xml中创建listview用entries属性附上一个数组资源
其中divider属性是设置分割线可以使用颜色和drawable资源分割
<listview android:id="@+id/listview1" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="#33000000" android:dividerheight="0.2dp" android:footerdividersenabled="true" android:headerdividersenabled="true" android:entries="@arrary/ctype"> </listview>
在values下定义一个数组资源文件arrays.xml
<resources> <item >情景模式1</item> <item >情景模式2</item> <item >情景模式3</item> </resources>
2.创建arrayadapter指定要显示的列表项
在oncreat方法中关联适配器
simple_list_item_1:列表项为普通文本
simple_list_item_2:列表项为普通文本字体略大
simple_list_item_checked:列表项为一个已选中的
simple_list_item_multiple_choice:带有复选框的列表项
simple_list_item_single_choice:带有单选按钮的列表项
listview = (listview) findviewbyid(r.id.listview1); arrayadapter<charsequence> adapter = arrayadapter.createfromresource(this,r.array.ctype, android.r.layout.simple_list_item_checked); listview.setadapter(adapter);
二、让activity继承listactivity实现
public class activitymain extends listactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); string[] ctype ={"1","2","3"}; arrayadapter<string> adapter = new arrayadapter<string>(this,android.r.layout.simple_list_item_1,ctype); setlistadapter(adapter); } @override protected void onlistitemclick(listview l, view v, int position, long id) { super.onlistitemclick(l, v, position, id); } }
三、simpleadapter和baseaapter的使用(重点)
simpleadapter的使用
在main.xml中添加listview组件
编写用于布局列表项内容的布局文件items.xml
创建一个简单适配器与listview关联
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <imageview android:id="@+id/image" android:paddingright="10px" android:paddingtop="20px" android:paddingbottom="20px" android:adjustviewbounds="true" android:maxwidth="72px" android:maxheight="72px" android:layout_height="wrap_content" android:layout_width="wrap_content"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10px" android:layout_gravity="center" android:id="@+id/title" /> </linearlayout>
public class mainactivity extends activity { @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); listview listview = (listview) findviewbyid(r.id.listview1); // 获取列表视图 int[] imageid = new int[] { r.drawable.img01, r.drawable.img02, r.drawable.img03, r.drawable.img04, r.drawable.img05, r.drawable.img06, r.drawable.img07, r.drawable.img08 }; // 定义并初始化保存图片id的数组 string[] title = new string[] { "保密设置", "安全", "系统设置", "上网", "我的文档", "gps导航", "我的音乐", "e-mail" }; // 定义并初始化保存列表项文字的数组 list<map<string, object>> listitems = new arraylist<map<string, object>>(); // 创建一个list集合 // 通过for循环将图片id和列表项文字放到map中,并添加到list集合中 for (int i = 0; i < imageid.length; i++) { map<string, object> map = new hashmap<string, object>(); // 实例化map对象 map.put("image", imageid[i]); map.put("title", title[i]); listitems.add(map); // 将map对象添加到list集合中 } simpleadapter adapter = new simpleadapter(this, listitems, r.layout.items, new string[] { "title", "image" }, new int[] { r.id.title, r.id.image }); // 创建simpleadapter listview.setadapter(adapter); // 将适配器与listview关联 } }
三、baseadapter的使用及listview的优化
使用方法同上主要是baseadapter的使用更加灵活也更加强大,可以向其中添加其他控件。
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <imageview android:id="@+id/imageview1" android:layout_width="50dip" android:layout_height="50dip" android:layout_marginleft="5dip" android:layout_margintop="5dip" android:layout_marginbottom="5dip" android:src="@android:drawable/ic_lock_power_off" /> <textview android:id="@+id/textview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/textview2" android:layout_torightof="@+id/imageview1" android:text="name" android:textcolor="#000000" android:textsize="20sp" /> <textview android:id="@+id/textview2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbottom="@+id/imageview1" android:layout_torightof="@+id/imageview1" android:text="number" android:textcolor="#000000" android:textsize="20sp" /> </relativelayout>
public class mainactivity extends activity { private listview lv; private list<myinfo> infos; private random random; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); lv = (listview) findviewbyid(r.id.listview1); infos = new arraylist<myinfo>(); //通过for循环将name和number添加到list集合中 for (int i = 0; i < 100; i++) { myinfo userinfo = new myinfo(); userinfo.setname("name"+i); userinfo.setnumber("number"+i); infos.add(userinfo); system.out.println(userinfo.tostring()); } lv.setadapter(new myadapter()); } private class myadapter extends baseadapter{ @override public int getcount() { return infos.size();//返回listview的长度 } @override public view getview(int position, view convertview, viewgroup parent) { myinfo userinfo = infos.get(position); view view; viewholder holder; //减少内存中view对象创建的次数 if (convertview != null && convertview instanceof relativelayout) { view = convertview;//复用已经回收掉的view对象 holder = (viewholder) view.gettag();//得到他们的引用 } else { view = view.inflate(getapplicationcontext(), r.layout.item_layout, null);//把布局文件转化成view对象 holder = new viewholder(); //把id存到存到holder对象中 //注意是在view下findviewbyid holder.iv = (imageview) view.findviewbyid(r.id.imageview1); holder.tv1 = (textview) view.findviewbyid(r.id.textview1); holder.tv2 = (textview) view.findviewbyid(r.id.textview2); view.settag(holder);//对象创建出来时找到他们的引用存到holder中 } holder.tv1.settext(infos.get(position).getname()); holder.tv2.settext(infos.get(position).getnumber()); return view; } @override public object getitem(int position) { return null; } @override public long getitemid(int position) { return 0; } } /* * view对象的容器记录view对象的内存地址相当于一个记事本 */ static class viewholder{ textview tv1; textview tv2; imageview iv; } } public class myinfo { private string name; private string number;//也可以添加bitmap @override public string tostring() { return "myinfo [name=" + name + ", number=" + number + "]"; } public string getname() { return name; } public void setname(string name) { this.name = name; } public string getnumber() { return number; } public void setnumber(string number) { this.number = number; } }
注意:(很多人不注意下面的这条语句是在view下findviewbyid,少了view会造成空指针异常)
holder.iv = (imageview) view.findviewbyid(r.id.imageview1);
优化的原理就是动态循环复用已经回收掉的listview对象(回收后为convertview),保持一个界面下的listview的条目数的动态平衡。(具体内容参考代码注释即可)
如对本文有疑问, 点击进行留言回复!!
Error running app: Default Activity Not Found
如何用HMS Nearby Service给自己的App添加近距离数据传输功能
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(四)
网友评论