步骤:
1.在主界面中配置<ListView>标签
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2.在res/layout/文件夹下创建account_item.xml文件,该文件指定每个条目的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp" >
<TextView
android:id="@+id/idTV"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="1"
android:textSize="20sp" />
<TextView
android:id="@+id/nameTV"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="wrap_content"
android:text="张三"
android:textSize="20sp" />
<TextView
android:id="@+id/balanceTV"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="wrap_content"
android:text="1234"
android:textSize="20sp" />
</LinearLayout>
3.Java代码构建ListView
获取ListView对象
设置一个Adapter
(1)BaseAdapter:实现内部抽象方法(Accout javabean中包含id,name,balance)
package com.itheima.sqlite.ui;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
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.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.itheima.sqlite.R;
import com.itheima.sqlite.bean.Account;
import com.itheima.sqlite.dao.AccountDao;
public class BaseActivity extends Activity {
private List<Account> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println(Environment.getExternalStorageDirectory());
//查询数据库中数据,在界面上显示查询到的内容;
AccountDao dao = new AccountDao(this);
list = dao.queryAll();
//获取listview对象;
ListView lv = (ListView) findViewById(R.id.lv);
//添加适配器;该适配器为自己定义的类继承的BaseAdapter;
lv.setAdapter(new MyAdapter());
//添加事件监听
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Account a = (Account) parent.getItemAtPosition(position); // Account
Toast.makeText(BaseActivity.this, a.toString(), Toast.LENGTH_SHORT).show();
System.out.println(id);
}
});
}
//自己定义类来继承baseadapter;
private class MyAdapter extends BaseAdapter { // 自定义类继承BaseAdapter, 定义怎么把数据封装成View, 添加到ListView
public int getCount() { // 获取条目的数量
return list.size();
}
public Object getItem(int position) { // 获取指定位置上的数据
return list.get(position);
}
public long getItemId(int position) { // 获取指定条目的id
return list.get(position).getId();
}
public View getView(int position, View convertView, ViewGroup parent) { // 获取指定位置上的条目视图
System.out.println("getView: " + position);
// 根据定义好的布局文件, 创建一个View(LinearLayout);convertview为要报废的view,使用它的时候,必须判断是否为null;
View v = convertView == null ? View.inflate(BaseActivity.this, R.layout.account_item, null) : convertView;
TextView idTV = (TextView) v.findViewById(R.id.idTV);
TextView nameTV = (TextView) v.findViewById(R.id.nameTV);
TextView balanceTV = (TextView) v.findViewById(R.id.balanceTV);
// 获取到集合中指定位置上的对象, 把对象中的数据装入TextView
final Account a = list.get(position);
idTV.setText(a.getId() + "");
nameTV.setText(a.getName());
balanceTV.setText(a.getBalance() + "");
//给某一个具体的条目添加点击事件;
nameTV.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast.makeText(BaseActivity.this, a.getName(), Toast.LENGTH_SHORT).show();
}
});
balanceTV.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast.makeText(BaseActivity.this, a.getBalance() + "", Toast.LENGTH_SHORT).show();
}
});
return v;
}
}
}
(2)SimpleAdapter:以List<Map<String, ?>>形式封装数据,关键代码为:
// 从数据库中查询出所有数据
AccountDao dao = new AccountDao(this);
List<Account> list = dao.queryAll(); // 封装数据的集合
List<Map<String, Object>> data = new ArrayList<Map<String,Object>>(); // 适配器要求的集合
// 遍历封装数据的集合, 把每个Account中的数据装入一个Map中, 再把所有Map装入适配器要求的集合中
for (Account a : list) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("_id", a.getId());
map.put("name", a.getName());
map.put("balance", a.getBalance());
data.add(map);
}
// 创建Adapter
SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.account_item // 创建适配器, 指定Context, 数据, 布局文件
, new String[]{ "_id", "name", "balance" } // 数据Map中的Key
, new int[]{ R.id.idTV, R.id.nameTV, R.id.balanceTV }); // TextView的id
// 设置Adapter
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Map<String, Object> map = (Map<String, Object>) parent.getItemAtPosition(position); // 获取条目上的数据(Map)
Toast.makeText(SimpleActivity.this, map.get("name").toString(), Toast.LENGTH_SHORT).show();
}
});
(3)SimpleCursorAdapter:以Cursor对象封装数据,Cursor中需要有“_id”一列,关键代码为:
// 根据ID获取ListView
ListView lv = (ListView) findViewById(R.id.lv);
// 要添加的数据
String[] arr = { "条目1", "条目2", "条目3", "条目4", "条目5", "条目6", "条目7", "条目8", "条目9", "条目10" };
// 创建适配器(把数据封装成View, 添加到ListView的工具)
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item, R.id.tv, arr);
// 向ListView中添加条目(设置适配器)
lv.setAdapter(adapter);
// 处理点击事件
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String s = (String) parent.getItemAtPosition(position); // 获取指定条目上的数据
Toast.makeText(ArrayActivity.this, s, Toast.LENGTH_SHORT).show(); // 弹出
}
});
(4)ArrayAdapter,主要用来操作简单的字符串,关键代码为:
<span style="white-space:pre"> </span>AccountDao dao = new AccountDao(this);
<span style="white-space:pre"> </span>Cursor c = dao.queryCursor();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.account_item, c
, new String[] { "_id", "name", "balance" } // 结果集中的列名(必须包含_id)
, new int[] { R.id.idTV, R.id.nameTV, R.id.balanceTV }); // 指定列上的数据对应哪些TextView
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Cursor c = (Cursor) parent.getItemAtPosition(position); // Cursor.moveToPosition(position)
Toast.makeText(getApplicationContext(), c.getString(1), Toast.LENGTH_SHORT).show();
}
});
调用ListView的getItemAtPosition(int)方法可以获取封装数据的容器
如果传入的是BaseAdapter,获取到的就是我们自定义方法中返回的内容
如果传入的是SimpleAdapter,获取到的就是一个Map<String, ?>
如果传入的是SimpleCursorAdapter,获得到的就是一个Cursor,并且Cursor以指向选中的一条记录