您的位置:首页 > 移动开发 > Android开发

Android基础(四) ListView的使用

2013-04-21 17:18 525 查看
1.ListView的创建

XML配置:

在主界面main.xml中配置<ListView>标签

在res/layout/文件夹下创建一个新的xml文件,用于指定每个条目的布局

2.使用Java代码构建ListView

在Activity中使用Context.findViewById()获得ListView对象

3.为ListView对象设置适配器(Adapter)

BaseAdapter:直接创建SimpleAdapter对象,传入当前环境(Context),数据(List),布局文件(id),数据和布局文件的映射关系为(String[],int[])

SimpleAdapter:以List<Map<String,?>>的形式封装数据

SimpleCursorAdapter:直接创建SimpleCursorAdapter对象,传入当前环境(Context),布局文件(id),数据(Cursor),数据和布局文件的映射关系为(String[],int[])

4.为ListView设置点击条目的监听事件(OnItemClickListener)

调用ListView.setOnItemClickListener()方法为ListView添加一个OnItemClickListener,在onItemClick()方法中,使用parent.getItemAtPosition(position)方法可以获取到指定位置上的数据

BaseAdapter获取到的是自定义的getItem()方法返回的数据

SimpleAdapter获取到的是指定位置上的Map

SimpleCursorAdapter获取到的是一个已经move到指定位置的Cursor

布局main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
android:id="@+id/personLV"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>

</LinearLayout>


条目布局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="match_parent"
android:orientation="horizontal"
android:padding="10dp"
>

<TextView
android:id="@+id/idTV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/di_text"
android:textSize="20sp"
/>
<TextView
android:id="@+id/nameTV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/name_text"
android:textSize="20sp"
android:gravity="center"
/>
<TextView
android:id="@+id/balanceTV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/balance_text"
android:textSize="20sp"
android:gravity="right"
/>

</LinearLayout>


BaseAdapter的使用

public class BaseAdapterActivity extends Activity {
private List<Person> persons;
private PersonDao dao;
MyBaseAdapter adapter = new MyBaseAdapter();

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

dao = new PersonDao(this);
persons = dao.queryAll();
// 创建ListView
ListView personLV = (ListView) findViewById(R.id.personLV);
// 给ListView添加适配器,适配器中做好了内存管理机制,但是需要手动创建视图
personLV.setAdapter(adapter);
}

private class MyBaseAdapter extends BaseAdapter {

public int getCount() {// ListView中总共的条目数
return persons.size();
}

public Object getItem(int position) {// 当点击某个条目时返回的数据
return persons.get(position);
}

public long getItemId(int position) {// 获取条目的id
return position;
}

public View getView(final int position, View convertView, ViewGroup parent) {// 生成指定位置上的视图
System.out.println("position:" + position);
// 根据item.xml生成一个View(Linerlayout),返回出去,自动添加到ListView中
/*
* View view = View.inflate(getApplicationContext(), R.layout.item,
* null);
*/
// 如果convertView为空,则创建新的View,如果不为空,则重新使用convertView。能够提高效率
View view = convertView == null ? View.inflate(
getApplicationContext(), R.layout.item, null) : convertView;
// 从创建出来的View(Linerlayout)中获取TextView
// 此时View刚刚创建,从activity中是找不到的,所以不能使用this.findViewById(),而是view..findViewById()
TextView idTV = (TextView) view.findViewById(R.id.idTV);
TextView nameTV = (TextView) view.findViewById(R.id.nameTV);
TextView balanceTV = (TextView) view.findViewById(R.id.balanceTV);

// 获取指定位置上的Person
Person p = persons.get(position);
// 给TextView设置文本(注意:不能设置int型数据,如果id设置为int型,则会成为strings.xml中字符串的id,所以应设置字符串型)
idTV.setText(p.getId() + "");
nameTV.setText(p.getName());
balanceTV.setText(p.getBalance() + "");

balanceTV.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
Person person = persons.get(position);//最好在这里独立获取Person,如果将前面的Person定义为final的,则在引用的时候可能会出问题
person.setBalance(person.getBalance()+1);//点击时改变数据
dao.update(person);//更新数据库中的数据
adapter.notifyDataSetChanged();//刷新ListView

}
});

return view;
}

}

}


SimpleAdapter的使用

public class SimpleAdapterActivity extends Activity {
private List<Person> persons;
private SimpleAdapter adapter;
private PersonDao dao;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

dao = new PersonDao(this);
persons = dao.queryAll();
// 创建ListView
ListView personLV = (ListView) findViewById(R.id.personLV);

List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();// 用于装载数据的集合,每个Map对应一个Person
for (Person person : persons) {// 循环遍历Person集合,将Person装入Map中,然后装入data中
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", person.getId());
map.put("name", person.getName());
map.put("balance", person.getBalance());
data.add(map);
}

adapter = new SimpleAdapter(this, data, R.layout.item, // 指定当前环境、数据和布局文件
new String[] { "id", "name", "balance" }, // Map中的key(指定数据来源)
new int[] { R.id.idTV, R.id.nameTV, R.id.balanceTV });
personLV.setAdapter(adapter);// 指定输入要填充到哪里
// 给点击Item添加监听器
personLV.setOnItemClickListener(new MyOnItemClickListener());

}

private class MyOnItemClickListener implements OnItemClickListener {

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// c.moveToPosition(position);//将右边移动到点击的位置
Map<String, Object> map=(Map<String, Object>) parent.getItemAtPosition(position);// 获取指定item上的数据,,获取的是指定位置的Map。(因为此处没有定义Cursor)

/*// 也可以通过当前的View来获取数据
System.out.println(((TextView) view.findViewById(R.id.nameTV))
.getText());

String name = (String) map.get("name");// 获取要显示的数据
Toast.makeText(getApplicationContext(), name, Toast.LENGTH_SHORT)
.show();// 弹出要显示的数据*/
map.put("balance", (Integer)map.get("balance")-1);
adapter.notifyDataSetChanged();//更新ListView

//更新数据库
dao.update(new Person((Integer)map.get("id"),(String)map.get("name"),(Integer)map.get("balance")));
}

}
}


SimpleCursorAdapter的使用

public class SimpleCursorAdapterActivity extends Activity {

private Cursor c;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//创建ListView
ListView personLV = (ListView) findViewById(R.id.personLV);

// 查询出所有数据
PersonDao dao = new PersonDao(this);

c = dao.queryAllCusor();
// 给ListView添加适配器,适配器中做好了内存管理机制,但是需要手动创建视图
personLV.setAdapter(new SimpleCursorAdapter(this, R.layout.item, c, //指定当前环境、数据和布局
new String[]{"_id","name","balance"}, //游标中的列名,该adpter使用数据时,需要有_id字段,如果数据库中不存在_id字段,可以设置别名
new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));//要填充数据的目标
// 给点击Item添加监听器
personLV.setOnItemClickListener(new MyOnItemClickListener());

}
private class MyOnItemClickListener implements OnItemClickListener{

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//			c.moveToPosition(position);//将右边移动到点击的位置
Cursor c =(Cursor) parent.getItemAtPosition(position);//获取指定item上的数据,当无法获得Cursor时,可以使用该方法

//也可以通过当前的View来获取数据
System.out.println(((TextView) view.findViewById(R.id.nameTV))
.getText());

String balance = c.getString(c.getColumnIndex("balance"));//获取要显示的数据
Toast.makeText(getApplicationContext(), balance, Toast.LENGTH_SHORT).show();//弹出要显示的数据
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: