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())。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。