main4.xml

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/listView4_1_1"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView></LinearLayout>


main4_item.xml

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center"><ImageViewandroid:id="@+id/p_w_picpathView4_1_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_launcher"/><TextViewandroid:id="@+id/textView4_1_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="textView"/></LinearLayout>


MainActivity4

packagecom.example.listview;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importandroid.R.anim;importandroid.R.drawable;importandroid.app.Activity;importandroid.os.Bundle;importandroid.widget.ListView;importandroid.widget.SimpleAdapter;publicclassMainActivity4extendsActivity{privateListViewlistView;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){//TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);setContentView(R.layout.main4);listView=(ListView)findViewById(R.id.listView4_1_1);//一个列表项的内容Map<String,Object>map=newHashMap<String,Object>();map.put("p_w_picpath",R.drawable.ic_launcher);map.put("name","张三");Map<String,Object>map2=newHashMap<String,Object>();map2.put("p_w_picpath",R.drawable.ic_launcher);map2.put("name","王五");List<Map<String,Object>>list=newArrayList<Map<String,Object>>();list.add(map);list.add(map2);SimpleAdaptersimpleAdapter=newSimpleAdapter(this,list,R.layout.main4_item,newString[]{"p_w_picpath","name"},newint[]{R.id.p_w_picpathView4_1_1,R.id.textView4_1_1});listView.setAdapter(simpleAdapter);}}



亦可以自定义Adapter

mian5.xml

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/listView5_1_1"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView></LinearLayout>

main5_item.xml

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center"><ImageViewandroid:id="@+id/p_w_picpathView5_1_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/a"/><TextViewandroid:id="@+id/textView5_1_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="textView"/></LinearLayout>

MainActivity5

packagecom.example.listview;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.ImageView;importandroid.widget.ListView;importandroid.widget.TextView;publicclassMainActivity5extendsActivity{privateListViewlistView;//定义的数据privateint[]p_w_picpaths={R.drawable.ic_launcher,R.drawable.ic_launcher};privateString[]names={"xiaobai","xiaoming"};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){//TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);setContentView(R.layout.main5);listView=(ListView)findViewById(R.id.listView5_1_1);listView.setAdapter(newMyAdapter());}//自定义适配器classMyAdapterextendsBaseAdapter{//获取列表项总数@OverridepublicintgetCount(){//TODOAuto-generatedmethodstubreturnnames.length;}//获取每一个列表项(根据下标获取)@OverridepublicObjectgetItem(intposition){//TODOAuto-generatedmethodstubreturnnames[position];}//获取每一个列表项的id@OverridepubliclonggetItemId(intposition){//TODOAuto-generatedmethodstubreturnposition;}//@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){//TODOAuto-generatedmethodstub//获取布局填充器LayoutInflaterlayoutInflater=getLayoutInflater();//获取main5_item的布局模板Viewview=layoutInflater.inflate(R.layout.main5_item,null);//从得到的view查找相应viewImageViewp_w_picpathView=(ImageView)view.findViewById(R.id.p_w_picpathView5_1_1);TextViewtextView=(TextView)view.findViewById(R.id.textView5_1_1);p_w_picpathView.setImageResource(p_w_picpaths[position]);textView.setText(names[position]);returnview;}}}

这种方式会多次调用getView()方法



优化方法

main5.xml

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/listView5_1_1"android:layout_width="match_parent"android:layout_height="fill_parent"></ListView></LinearLayout><!--android:layout_height="wrap_content"会导致在ListView中增加子组件时,多次重复调用getView方法设置成android:layout_height="fill_parent"则每次增加新组建时调用一次-->

ListView设置成android:layout_height="fill_parent"

//屏幕一次显示7(假设)条记录,则调用7次getView方法,只负责在屏幕中显示的内容的创建,其他的在滑动显示时才创建//因为ListView的高度设置为android:layout_height="wrap_content"//调用一次getView,绘制一次,增加子组件时会重新绘制(计算高度),所以会多次调用getView()方法//增加一个组件,重新绘制ListView,//每绘制一次ListView,每一个子组件都重新绘制(有几个子组件调用几次)//ListView设置成android:layout_height="fill_parent"//只输出0,1,2,3,4,5一次System.out.println("position:"+position);



将activity中代码修改为:

System.out.print("position:"+position);System.out.println(""+convertView);//获取布局填充器LayoutInflaterlayoutInflater=getLayoutInflater();//获取main5_item的布局模板,创建布局对象//如果没有空闲的convertView,创建convertView,否则重复利用convertViewif(convertView==null){convertView=layoutInflater.inflate(R.layout.main5_item,null);}

convertView的使用,主要优化加载布局问题


增加优化二:内部类ViewHolder的使用。

主要优化getView方法中每次回调用findviewByID()方法来获取一次控件的代码。

新增加内部类ViewHolder,用于对控件的实力存储进行缓存。

packagecom.example.listview;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.ImageView;importandroid.widget.ListView;importandroid.widget.TextView;publicclassMainActivity5extendsActivity{privateListViewlistView;//定义的数据privateint[]p_w_picpaths={R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher};privateString[]names={"xiaobai","xiaoming","xiaobai","xiaoming","xiaobai","xiaoming","xiaobai","xiaoming","xiaobai","xiaoming","xiaobai","xiaoming"};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){//TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);setContentView(R.layout.main5);listView=(ListView)findViewById(R.id.listView5_1_1);listView.setAdapter(newMyAdapter());}//自定义适配器//ListView的优化://1.重复使用convertView对象//2.使用viewHolder提高在容器中查找组件的效率classMyAdapterextendsBaseAdapter{//获取列表项总数@OverridepublicintgetCount(){//TODOAuto-generatedmethodstubreturnnames.length;}//获取每一个列表项(根据下标获取)@OverridepublicObjectgetItem(intposition){//TODOAuto-generatedmethodstubreturnnames[position];}//获取每一个列表项的id@OverridepubliclonggetItemId(intposition){//TODOAuto-generatedmethodstubreturnposition;}//@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){//TODOAuto-generatedmethodstub//屏幕一次显示7(假设)条记录,则调用7次getView方法,只负责在屏幕中显示的内容的创建,其他的在滑动显示时才创建//因为ListView的高度设置为android:layout_height="wrap_content"//调用一次getView,绘制一次,增加子组件时会重新绘制(计算高度),所以会多次调用getView()方法//增加一个组件,重新绘制ListView,//每绘制一次ListView,每一个子组件都重新绘制(有几个子组件调用几次)//ListView设置成android:layout_height="fill_parent"//只输出0,1,2,3,4,5一次System.out.print("position:"+position);System.out.println(""+convertView);//获取布局填充器LayoutInflaterlayoutInflater=getLayoutInflater();//获取main5_item的布局模板,创建布局对象//如果没有空闲的convertView,创建convertView,否则重复利用convertViewViewHolderviewHolder;if(convertView==null){convertView=layoutInflater.inflate(R.layout.main5_item,null);viewHolder=newViewHolder();viewHolder.p_w_picpathView=(ImageView)convertView.findViewById(R.id.p_w_picpathView5_1_1);viewHolder.textView=(TextView)convertView.findViewById(R.id.textView5_1_1);convertView.setTag(viewHolder);}else{viewHolder=(ViewHolder)convertView.getTag();}//ViewconvertView=layoutInflater.inflate(R.layout.main5_item,null);//从得到的view查找相应view/*ImageViewp_w_picpathView=(ImageView)convertView.findViewById(R.id.p_w_picpathView5_1_1);TextViewtextView=(TextView)convertView.findViewById(R.id.textView5_1_1);p_w_picpathView.setImageResource(p_w_picpaths[position]);textView.setText(names[position]);*/viewHolder.p_w_picpathView.setImageResource(p_w_picpaths[position]);viewHolder.textView.setText(names[position]);returnconvertView;}}classViewHolder{ImageViewp_w_picpathView;TextViewtextView;}}