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