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