文档章节

android中ListView的使用

ht896632
 ht896632
发布于 2016/03/02 14:07
字数 1133
阅读 13
收藏 0

1.ListView显示数据

绑定数据的方法:可以通过适配器来进行绑定,系统提供了两个适配器(SimpleAdapter、SimpleCursorAdapter),

同时也可以自定义适配器,因为在有些时候,系统提供的适配器并不能满足我们的需求。

SimpleAdapter:

private void show1() {
		//获取一个集合列表
		List<User> users = userService.getScrollData(0, 20);
		//将普通list集合封装为SimpleAdapter所需要的List<HashMap<String, Object>>集合
		List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
		for (User user : users) {
			HashMap<String, Object> item = new HashMap<String, Object>();
			item.put("id", user.getId());
			item.put("name", user.getName());
			item.put("age", user.getAge());
			item.put("amount", user.getAmount());
			data.add(item);
		}
		/**
		 * 第一个参数:当前对象 第二个参数:要绑定的数据,类型为List<HashMap<String, Object>>
		 * 第三个参数:要绑定到哪个资源文件 第四个参数:
		 */
		SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item,
				new String[] { "name", "age", "amount" }, new int[] {
						R.id.name, R.id.age, R.id.amount });
		listView.setAdapter(adapter);
	}
SimpleCursorAdapter:

private void show2() {
		//返回一个Cursor对象
		Cursor cursor = userService.getCursorScrollData(0, 20);
		// 使用Cursor是配器会出现如下错误:
		// 04-16 12:39:40.699: ERROR/AndroidRuntime(378): FATAL EXCEPTION: main
		// 04-16 12:39:40.699: ERROR/AndroidRuntime(378):
		// java.lang.RuntimeException: Unable to start activity
		// ComponentInfo{cn.kafei.db/cn.kafei.db.DbActivity}:
		// java.lang.IllegalArgumentException: column '_id' does not exist
		// 04-16 12:39:40.699: ERROR/AndroidRuntime(378): Caused by:
		// java.lang.IllegalArgumentException: column '_id' does not exist
		// 解决方案:为实体类id属性改为_id,或者在查询数据库时将主键ID重命名为_id;select id as _id from user
		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
				R.layout.item, cursor,
				new String[] { "name", "age", "amount" }, new int[] {
						R.id.name, R.id.age, R.id.amount });
		listView.setAdapter(adapter);
	}
自定义适配器:

说明:自定义适配器需要继承BaseAdapter适配器,并且重写它的方法

示例:

import java.util.List;

import cn.kafei.db.R;
import cn.kafei.pojo.User;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class UserAdapter extends BaseAdapter {
	private List<User> users;// 绑定的数据
	private int resource;// 绑定的条目界面
	private LayoutInflater inflater;// 布局填充器

	public UserAdapter(Context context, List<User> users, int resource) {
		this.users = users;
		this.resource = resource;
		inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);// 取得系统内置的布局填充器
	}

	/**
	 * 获得记录总数
	 */
	@Override
	public int getCount() {
		return users.size();
	}

	/**
	 * 取得某个索引对应的对象
	 */
	@Override
	public Object getItem(int position) {
		return users.get(position);
	}

	/**
	 * 取得条目的索引
	 */
	@Override
	public long getItemId(int position) {
		return position;
	}

	/**
	 * position:要绑定的数据条目在集合中的索引值
	 */
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		TextView nameView = null;
		TextView ageView = null;
		TextView amountView = null;
		// 如果等于空,表示显示的是第一页,如果不是第一页,传进来的是缓存的对象
		if (convertView == null) {
			// 生成条目界面对象
			convertView = inflater.inflate(resource, null);
			// 查找控件
			nameView = (TextView) convertView.findViewById(R.id.name);
			ageView = (TextView) convertView.findViewById(R.id.age);
			amountView = (TextView) convertView.findViewById(R.id.amount);
			// 缓存控件
			ViewCache cache = new ViewCache();
			cache.nameView = nameView;
			cache.ageView = ageView;
			cache.amountView = amountView;
			convertView.setTag(cache);// 利用视图标志放入缓存对象
		} else {
			// 取出缓存的控件
			ViewCache cache = (ViewCache) convertView.getTag();
			nameView = cache.nameView;
			ageView = cache.ageView;
			amountView = cache.amountView;
		}

		User user = users.get(position);
		// 实现数据绑定
		nameView.setText(user.getName());
		ageView.setText(user.getAge().toString());// int型的需要转换为string类型否则会报错
		amountView.setText(user.getAmount().toString());
		return convertView;
	}

	/**
	 * 缓存数据,避免每次都进行查找控件,以提高性能 这里没有使用getter
	 * setter方法进行赋值,主要是考虑到虚拟机加载到内存的文件大小,节省内存开销,当然这个影响不是很大,可以忽略
	 * 
	 */
	private final class ViewCache {
		public TextView nameView;
		public TextView ageView;
		public TextView amountView;
	}
}
使用方法:

/**
	 * 自定义适配器实现数据的绑定
	 */
	private void show3() {
		//返回数据集合
		List<User> users = userService.getScrollData(0, 20);
		//当前对象、数据集合、要引用的资源文件
		UserAdapter adapter = new UserAdapter(this, users, R.layout.item);
		listView.setAdapter(adapter);
	}
2.如何获取ListView中显示的数据

首先:为ListView注册setOnItemClickListener监听器,意思是当点击ListView中的任何一个条目时触法(调用)

监听器实现:

/**
	 * 当listView的条目被点击后调用
	 */
	private final class ItemClickListener implements OnItemClickListener {
		/**
		 * 第一个参数:点击条目所在的ListView 第二个参数:当前点击条目的view对象,也就是界面对象
		 * 第三个参数:当前点击条目在绑定集合中的所引值
		 */
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			ListView lView = (ListView) parent;
			// 自定义适配器,如果ListView绑定的是一个对象集合,也就是每一条数据代表一个实体对象,可以使用这种方式进行获取
			// User
			// user=(User)lView.getItemAtPosition(position);//根据索引取得在集合中所对应的条目
			// <==================================================================>
			
			// 如果ListView是用SimpleCursorAdapter进行绑定数据的可以使用这样的方式进行获取数据
			// Cursor cursor = (Cursor) lView.getItemAtPosition(position);
			// int userId = cursor.getInt(cursor.getColumnIndex("_id"));
			// <==================================================================>
			
			// 如果ListView是用SimpleAdapter进行绑定数据的可以使用这样的方式进行获取数据
			HashMap<String, Object> data = (HashMap<String, Object>) lView
					.getItemAtPosition(position);
			Toast.makeText(getApplicationContext(), data.get("id").toString(),
					1).show();
		}
	}

为listView绑定监听器

listView.setOnItemClickListener(new ItemClickListener());


© 著作权归作者所有

共有 人打赏支持
ht896632
粉丝 36
博文 53
码字总数 31361
作品 0
闵行
高级程序员
私信 提问
android中listview的一些样式设置

在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:back...

子曰疯
2013/10/29
0
1
Android ListView 滑动背景为黑色的解决办法 listview小知识整理

在别的地方看到的,转过来作为记录!! 在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备...

假装是大神
2012/12/20
0
0
ScrollView 与ListView共存会存在滚动的问题

ScrollView 与ListView共存会存在滚动的问题,并且ListView只显示一个半Item。 当ListView的高度设定一定的值时,ListView同样地会显示对应的高度的Item。 因此我们可以计算出这个ListView的...

Jonson
2013/01/06
0
1
转: Android ListView 滑动背景为黑色的解决办法

在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:back...

vane_
2012/05/25
0
0
Android Your content must have a ListView whose...

Android Your content must have a ListView whose id attribute is 'android.R.id.list'错误的解决办法 在Android开发中,ListView有着很重要的地位,使用的场合也非常的多 错误提示:Your ...

哈全文
2012/04/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 快捷键

快捷键图标。 官方的下载地址为:https://atlassianblog.wpengine.com/wp-content/uploads/2018/01/keyboard-shortcuts-infographics.pdf...

honeymose
51分钟前
2
0
Apache限定目录解析PHP,限制user_agent,PHP相关的配置

Apache限定目录解析PHP 配置前访问upload/index.php [root@test-a ~]# curl -x192.168.77.139:80 'www.test.com/upload/index.php'This is upload diretory 配置,/usr/local/apache2.4/......

野雪球
54分钟前
3
0
java.util.Concurrent.Exchanger源码

类图 源码: package java.util.concurrent;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent......

狼王黄师傅
今天
5
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
4
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部