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());