Listview控件使用

Listview 功能:1)列表数据的展示  2)用户点击或选中处理 

创建ListView大体步骤: 1)提供数据的List<Map> 2)创建adapter并关联相应的布局和数据  3)ListView设置相应的adapter 

类型:1 普通的展示列表  2 带有单选和复选操作的展示列表  3 自定义每一行view的对象展示列表(可以显示图片等)4 使用BaseAdapter优化列表  

代码: 

   1 Log.v("MyListViewBase", "你点击了按钮" + position); // 可以打印信息到  android的控制台 

   2 convertView.setTag(holder); setTag可以在一个对象上绑定一个对象组  

package com.example.fragmentdemo1;

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

 


import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Listview的使用
 * 
 * @author root 参考 :
 * http://www.cnblogs.com/noTice520/archive/2011/12/05/2276379.html
 *
 */
public class ListViewActivity extends Activity {
	
	private static final String[] strs = new String[] { "first", "second",
			"third", "fourth", "fifth" };
	private ListView lv; //显示数据的listView对象 
	//绑定数据
	private ArrayList<HashMap<String, Object>> listData;
	
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.list_view_test);
		lv = (ListView) findViewById(R.id.listview);
		// showArrayAdapterList();
		// showSimpleAdapterList();
		
		showBaseAdapterList();
	}

	/**
	 * ArrayAdapter 的使用 : 用来绑定一个数组,支持泛型操作 
	 * 一、列表的样式设置,以及是否可以选择、单选与多选的控制 
	 * 1 只作为列表展示
	 * 2 后面有个对号的列表展示,可以设置单选和多选 
	 * 3 带有 复选框的列表展示,可以单选和多选 
	 * 4 带有radio的列表展示,可以单选和多选
	 */
	private void showArrayAdapterList() {

		// 最简单的listView只作为展示
		// ArrayAdapter<String> adapter = new
		// ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,strs);
		// 可以进行多选,每一行后面有个“对号”
		// ArrayAdapter<String> adapter = new
		// ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked,strs);
		// 带有复选框的 列表
		// ArrayAdapter<String> adapter = new
		// ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,strs);
		// 带有 radio的列表
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_list_item_single_choice, strs);
		lv.setAdapter(adapter);

		// 如果需要选择功能需要进行这个设置: 单选、多选 给的参数不一样
		lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);// 多选
		// lv.setChoiceMode( ListView.CHOICE_MODE_SINGLE );//单选

		lv.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> adapter, View view,
					int adapterPosId, long rowId) {
				setTitle("你点击了第" + rowId + "行");
				// 得到单击的这一行的数据 :数组和下标 strs[adapterPosId] 、adapterPosId:数组的下标位置
				// 、rowId :单击的是哪一行
				Toast.makeText(getApplicationContext(),
						"你点击了第" + rowId + "行" + strs[adapterPosId],
						Toast.LENGTH_SHORT).show();
			}
		});
	}

	/**
	 * SimpleAdapter的使用,可以自定义列表中的布局, 用来绑定在xml中定义的控件对应的数据 1 数据:List<Map>的形式 2
	 * 创建SimpleAdapter: 1)每一个map就是一行数据 2) 每一行对应的数据根据adapter中对应的key映射到Map的key上 3
	 * 添加点击事件
	 */
	private void showSimpleAdapterList() {

		/* 定义一个动态数组 */
		final ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
		/* 在数组中存放数据 */
		for (int i = 0; i < 10; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("ItemImage", R.drawable.icon);// 加入图片
			map.put("ItemTitle", "第" + i + "行title");
			map.put("ItemText", "这是第" + i + "行text");
			listItem.add(map);
		}

		SimpleAdapter mSimpleAdapter = new SimpleAdapter(this,
				listItem,// 需要绑定的数据
				R.layout.simple_list_view_adapter,// 每一行的布局
				// 动态数组中的数据源的键对应到定义布局的View中
				new String[] { "ItemImage", "ItemTitle", "ItemText" },
				new int[] { R.id.ItemImage, R.id.ItemTitle, R.id.ItemText });
		lv.setAdapter(mSimpleAdapter);// 为ListView绑定适配器
		lv.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> adapter, View view,
					int adapterPosId, long rowId) {
				setTitle("你点击了第" + rowId + "行");// 设置标题栏显示点击的行
				// 取出单击这一行的Map
				Map dataMap = listItem.get(Integer.parseInt(rowId + ""));

				Toast.makeText(
						getApplicationContext(),
						"你点击了第" + rowId + "行" + dataMap.get("ItemTitle") + "  "
								+ dataMap.get("ItemText"), Toast.LENGTH_SHORT)
						.show();
			}
		});
	}

	/**
	 * 1 在list中添加按钮 ,响应事件 
	 * 2 优化list显示,使加快显示速度(重用list中行的view对象和对象查找时间)
	 */
	private void showBaseAdapterList() {
		listData = getData(); //准备数据 
		MyAdapter mAdapter = new MyAdapter(this);// 得到一个MyAdapter对象
		lv.setAdapter(mAdapter);// 为ListView绑定Adapter
		/* 为ListView添加点击事件 */
		lv.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				Log.v("MyListViewBase", "你点击了ListView条目" + arg2);// 在LogCat中输出信息

			}
		});
	}

	/* 添加一个得到数据的方法,方便使用 */
	private ArrayList<HashMap<String, Object>> getData() {

		ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
		/* 为动态数组添加数据 */
		for (int i = 0; i < 30; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("ItemTitle", "第" + i + "行");
			map.put("ItemText", "这是第" + i + "行");
			listItem.add(map);
		}
		return listItem;

	}

	/*
	 * 新建一个类继承BaseAdapter,实现视图与数据的绑定
	 */
	private class MyAdapter extends BaseAdapter {

		private LayoutInflater mInflater;// 得到一个LayoutInfalter对象用来导入布局

		/* 构造函数 */
		public MyAdapter(Context context) {
			this.mInflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
			return listData.size();// 返回数组的长度
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		/**
		 * 个人理解:
		 *   position: 列表的第几行控件调用了这个对象 
		 *   convertView: 在列表中position这一行对应加载数据的控件,滚动屏幕的时候View会被重用 (新滚动出来的view行就是上面消失的view对象)
		 *   
		 *   主要作用:1 加载行的布局view 2 加载行中每个控件的数据  3 重用convertView对象 
		 *   
		 */
		@Override
		public View getView(final int position, View convertView,
				ViewGroup parent) {
			ViewHolder holder;
			// 观察convertView随ListView滚动情况
			Log.v("MyListViewBase", "getView " + position + " " + convertView);
			if (convertView == null) {
				convertView = mInflater.inflate(R.layout.simple_list_view_baseadapter, null);
				holder = new ViewHolder();
				/* 得到各个控件的对象 */
				holder.title = (TextView) convertView
						.findViewById(R.id.ItemTitle);
				holder.text = (TextView) convertView
						.findViewById(R.id.ItemText);
				holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
				convertView.setTag(holder);// 绑定ViewHolder对象,就是讲当前的对象存储到convertView
			} else {
				holder = (ViewHolder) convertView.getTag();// 取出ViewHolder对象
			}
			/* 设置TextView显示的内容,即我们存放在动态数组中的数据 */
			holder.title.setText(listData.get(position).get("ItemTitle")
					.toString());
			holder.text.setText(listData.get(position).get("ItemText")
					.toString());

			/* 为Button添加点击事件 */
			holder.bt.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					Log.v("MyListViewBase", "你点击了按钮" + position); // 打印Button的点击信息

				}
			});
			return convertView;
		}
	}

	/* 存放控件  */
	public final class ViewHolder {
		public TextView title;
		public TextView text;
		public Button bt;
	}
}

猜你喜欢

转载自username2.iteye.com/blog/2185436