一个ListView通常有两个职责。
(1)将数据填充到布局。
(2)处理用户的选择点击等操作。
一个ListView的创建需要3个元素。
(1)ListView中的每一列的View。
(2)填入View的数据或者图片等。
(3)连接数据与ListView的适配器。
也就是说,要使用ListView,首先要了解什么是适配器。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便
Android中提供了很多的Adapter,以下列出了常用的几个。
ArrayAdapter
用来绑定一个数组,支持泛型操作
SimpleAdapter
用来绑定在xml中定义的控件对应的数据
SimpleCursorAdapter
用来绑定游标得到的数据
BaseAdapter
通用的基础适配器
- ListView使用ArrayAdapter
首先创建activity_main布局,在布局中定义一个ListView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
MainActivity.java程式
package com.example.uilistviewtest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
private String[] data = {"Apple","Banana","Orange","Pear","Grape","Watermelon","Cherry","Mango","Strawberry","Pineapple"};
ListView listView;
ArrayAdapter<String> adapter ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("ArrayAdapter Demo");
listView = (ListView)findViewById(R.id.listView);
//带有RadioButton 的ListView
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_single_choice,data);
listView.setAdapter(adapter);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); //多选
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "you click " + position, Toast.LENGTH_SHORT).show();
switch (position) {
case 0:
finish();
break;
case 7:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
break;
default:
break;
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {
case R.id.add:
Toast.makeText(MainActivity.this, "click add menu", Toast.LENGTH_SHORT).show();
break;
case R.id.remove:
Toast.makeText(MainActivity.this, "click remove menu", Toast.LENGTH_SHORT).show();
finish();
break;
default:
break;
}
return true;
}
}
分析一下使用的步骤。
(1)定义一个数组来存放ListView中item的内容。
(2)通过实现ArrayAdapter的构造函数来创建一个ArrayAdapter的对象。
(3)通过ListView的setAdapter()方法绑定ArrayAdapter。
其中第二步有必要说一下的是,ArrayAdapter有多个构造函数,例子中实现的是最常用的一种。第一个参数为上下文,第二个参数为一个包含TextView,用来填充ListView的每一行的布局资源ID。第三个参数为ListView的内容。其中第二个参数可以自定义一个layout,但是这个layout必须要有TextView控件。通常我们使用Android提供的资源,除了例子中所用的,常用的还有如下几种,可实现带RadioButton和CheckBox的ListView。
1、android.R.layout.simple_list_item_1 实现带TextView的ListView
2、android.R.layout.simple_list_item_checked 实现带选择框的ListView,需要用setChoiceMode()方法设定选择为多选还是单选,否则将不能实现选择效果
3、android.R.layout.simple_list_item_multiple_choice实现带CheckBox的ListView。需要用setChoiceMode()方法来设置单选或者多选
4、android.R.layout.simple_list_item_single_choice这个资源实现带RadioButton的ListView。这里要注意的是,这里并不是指定了单选。是多选还是单选要通过setChoiceMode()方法来指定
ListView中的四种模式:
* CHOICE_MODE_NONE 是普通模式,
* CHOICE_MODE_SINGLE 是单选模式,不常用,
* CHOICE_MODE_MULTIPLE 和 CHOICE_MODE_MULTIPLE_MODAL 都是多选模式
四种模式写法如下:
//带TextView 的ListView android.R.layout.simple_list_item_1
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,data);
listView.setAdapter(adapter);
//带选择框的ListView android.R.layout.simple_list_item_checked
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_checked,data);
listView.setAdapter(adapter);
listView.setChoiceMode(listView.CHOICE_MODE_MULTIPLE); //多选
//带有复选框的ListView android.R.layout.simple_list_item_multiple_choice
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice,data);
listView.setAdapter(adapter);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
//带有RadioButton 的ListView
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_single_choice,data);
listView.setAdapter(adapter);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); //单选
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); //多选
- ListView使用SimpleAdapter
我们在ListView除了展示一些文字外,还需要显示一些图片或者button,这是需要使用到SimpleAdapter。
SimpleAdapter可以通过它自定义ListView中的item的内容,比如图片、多选框等。
首先创建一个ListView 的每一行的布局,每行显示两行文字以及一张图片。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/imageView2_1"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/textView2_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"/>
<TextView
android:id="@+id/textView2_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/textView2_1"/>
</RelativeLayout>
另外创建布局文件,该布局文件中定义一个ListView控件。
<?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="vertical" >
<ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></ListView>
</LinearLayout>
JAVA程式:
package com.example.uilistviewtest;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class SecondActivity extends Activity{
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
setTitle("SimpleAdapter Demo");
listView = (ListView)findViewById(R.id.listView);
/*定义一个动态数组*/
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String,Object>>();
/*在数组中存放数据*/
for(int i=0;i<10;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemImage", R.drawable.ic_launcher);//加入图片
map.put("ItemTitle", "第"+i+"行");
map.put("ItemText", "这是第"+i+"行");
listItem.add(map);
}
SimpleAdapter mSimpleAdapter = new SimpleAdapter(
SecondActivity.this, //上下文
listItem,//需要绑定的数据
R.layout.item_second, //每一行的布局
new String[] {"ItemImage","ItemTitle", "ItemText"}, //每一行布局对应的数据键
new int[] {R.id.imageView2_1,R.id.textView2_1,R.id.textView2_2} //动态数组中的数据源的键对应到定义布局的View中
);
listView.setAdapter(mSimpleAdapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
setTitle("您点击了第" + position + "行");
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
}
});
}
}
使用simpleAdapter的数据一般都是用HashMap构成的列表,列表的每一节对应ListView的每一行。通过SimpleAdapter的构造函数,将HashMap的每个键的数据映射到布局文件中对应控件上。这个布局文件一般根据自己的需要来自己定义。梳理一下使用SimpleAdapter的步骤。
(1)根据需要定义ListView每行所实现的布局。
(2)定义一个HashMap构成的列表,将数据以键值对的方式存放在里面。
(3)构造SimpleAdapter对象。
(4)将LsitView绑定到SimpleAdapter上。
这里使用的SimpleAdapter构造方法有五个参数:
1、上下文;
2、需要绑定的数据,我们定义好的ArrayList
3、每一行的布局,我们之前创建的item_second 布局文件
4、每一行布局对应的数据源的键
5、数据源的键对应到布局的view中
通过setAdapter()方法绑定SimpleAdapter。
通过调用setOnItemClickListener方法为ListView设定监听,并复写OnItemClickeListener的onItemClick方法。
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
setTitle("您点击了第" + position + "行");
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
}
});