android中ListView的使用
博客专区 > ht896632 的博客 > 博客详情
android中ListView的使用
ht896632 发表于2年前
android中ListView的使用
  • 发表于 2年前
  • 阅读 10
  • 收藏 0
  • 点赞 1
  • 评论 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());


共有 人打赏支持
粉丝 33
博文 53
码字总数 31361
×
ht896632
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: