main4.xml



    
	
	
	
	


main4_item.xml



	
	


MainActivity4

package com.example.listview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.R.anim;
import android.R.drawable;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity4 extends Activity{
	private ListView listView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main4);
		listView=(ListView) findViewById(R.id.listView4_1_1);
		//一个列表项的内容
		Map map=new HashMap();
		map.put("p_w_picpath", R.drawable.ic_launcher);
		map.put("name", "张三");
		
		
		Map map2=new HashMap();
		map2.put("p_w_picpath", R.drawable.ic_launcher);
		map2.put("name", "王五");
		
		List> list=new ArrayList>();
		list.add(map);
		list.add(map2);
		SimpleAdapter simpleAdapter=new 
				SimpleAdapter(this, list, R.layout.main4_item, 
						new String [] {"p_w_picpath","name"}, 
						new int [] {R.id.p_w_picpathView4_1_1,R.id.textView4_1_1});
		listView.setAdapter(simpleAdapter);
	}
}

android的ListView图文混搭_第1张图片



亦可以自定义Adapter

mian5.xml



    
    
    

main5_item.xml



	
	

MainActivity5

package com.example.listview;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity5 extends Activity  {
	private ListView listView;
	//定义的数据
	private int [] p_w_picpaths={R.drawable.ic_launcher,R.drawable.ic_launcher};
	private String [] names={"xiaobai","xiaoming"};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main5);
		listView=(ListView) findViewById(R.id.listView5_1_1);
		listView.setAdapter(new MyAdapter());
		
		
	}
	//自定义适配器
	class MyAdapter extends BaseAdapter{
		//获取列表项总数
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return names.length;
		}
		//获取每一个列表项(根据下标获取)
		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return names[position];
		}
		//获取每一个列表项的id
		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}
		//
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			//获取布局填充器
			LayoutInflater layoutInflater=getLayoutInflater();
			//获取main5_item的布局模板
			View view=layoutInflater.inflate(R.layout.main5_item, null);
			//从得到的view查找相应view
			ImageView p_w_picpathView=(ImageView) view.findViewById(R.id.p_w_picpathView5_1_1);
			TextView textView=(TextView) view.findViewById(R.id.textView5_1_1);
			p_w_picpathView.setImageResource(p_w_picpaths[position]);
			textView.setText(names[position]);
			return view;
		}
		
	}
}

android的ListView图文混搭_第2张图片

android的ListView图文混搭_第3张图片

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



优化方法

main5.xml



    
    
    


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);

android的ListView图文混搭_第4张图片



将activity中代码修改为:

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

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

android的ListView图文混搭_第5张图片


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

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

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

package com.example.listview;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity5 extends Activity  {
	private ListView listView;
	//定义的数据
	private int [] 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};
	private String [] names={"xiaobai","xiaoming","xiaobai","xiaoming","xiaobai","xiaoming","xiaobai","xiaoming","xiaobai","xiaoming","xiaobai","xiaoming"};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main5);
		listView=(ListView) findViewById(R.id.listView5_1_1);
		listView.setAdapter(new MyAdapter());
		
		
	}
	//自定义适配器
	//ListView的优化:
	//1.重复使用convertView对象
	//2.使用viewHolder提高在容器中查找组件的效率
	class MyAdapter extends BaseAdapter{
		//获取列表项总数
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return names.length;
		}
		//获取每一个列表项(根据下标获取)
		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return names[position];
		}
		//获取每一个列表项的id
		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}
		//
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			//屏幕一次显示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);
			//获取布局填充器
			LayoutInflater layoutInflater=getLayoutInflater();
			//获取main5_item的布局模板,创建布局对象
			
			//如果没有空闲的convertView,创建convertView,否则重复利用convertView
			ViewHolder viewHolder;
			if(convertView==null){
				convertView=layoutInflater.inflate(R.layout.main5_item, null);
				viewHolder=new ViewHolder();
				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();
				
			}
			//View convertView=layoutInflater.inflate(R.layout.main5_item, null);
			//从得到的view查找相应view
			/*ImageView p_w_picpathView=(ImageView) convertView.findViewById(R.id.p_w_picpathView5_1_1);
			TextView textView=(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]);
			return convertView;
		}
		
	}
	
	
	
	class ViewHolder{
		ImageView p_w_picpathView;
		TextView textView;
	}
}