初识ListView
ListView组件是Android中最常用的组件之一,几乎所有的应用程序都会用到它。当我们需要显示大量的数据在手机屏幕上时,可以借助ListView来实现。
(1)ListView的简单用法
我们需要先建立一个工程,然后修改里面的activity_main.xml文件
<LinearLayout 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" android:orientation="vertical" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </LinearLayout>
这里我们需要指定控件的id,控件的高和宽都用match_parent。
接下来就是写MainActivity中的代码。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //得到ListView组件 ListView lv =(ListView) findViewById(R.id.lv); //需要显示的数据 String[] objects=new String[]{"张三","李四","王五","赵六","小强", "旺财","小六子","三德子","猪八戒","孙悟空","唐三藏","牛魔王","红孩儿"}; //将数据与适配器关联 lv.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, objects)); } }
我们在MainAvtivity里面做了三件事:(1)、获取ListView组件。(2)、得到一个适配器并设置了要显示的数据。(3)、将组件与适配器相关联。这样一个ListView显示数据就完成了。
事实上,这样只显示显示一个TextView还是太过单调。我们应该对ListView界面进行定制,显示我们需要的复制的样子。下面我们将在ListView中的每个条目中显示一张图片,旁边并配上文字。
(2)定制ListView界面
我们在ListView中显示一个人的照片的姓名。这样我们就先需要建立一个人类。
public class Person { private int imageId; private String name; public Person(int imageId, String name) { super(); this.imageId = imageId; this.name = name; } public Person() { super(); // TODO Auto-generated constructor stub } public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person [imageId=" + imageId + ", name=" + name + "]"; } }
然后我们在layout文件夹下面自定义一个布局文件person_item.xml,这个布局文件将加载到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="horizontal" > <ImageView android:id="@+id/iv_1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv_1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
在这个布局中,我们定义了一个ImageView来显示用户照片,一个TextView用来显示姓名。
接下来我们需要创建一个自定义的适配器了,这个适配器继承自ArrayAdapter,并将泛型指定为person类型。
class PersonAdapter extends ArrayAdapter<Person>{ public PersonAdapter(Context context, int textViewResourceId, List<Person> objects) { super(context,textViewResourceId, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { //得到条目中的person对象 Person person =getItem(position); View view; //优化性能,防止内存溢出 if(convertView == null){ //加载布局person_item.xml view =View.inflate(MainActivity.this, R.layout.person_item, null); }else{ view=convertView; } ImageView iv_1=(ImageView) view.findViewById(R.id.iv_1); TextView tv_1=(TextView) view.findViewById(R.id.tv_1); iv_1.setImageResource(person.getImageId()); tv_1.setText(person.getName()); return view; }
最后完成MainAcitity中的代码。
public class MainActivity extends Activity { List<Person> personList=new ArrayList<Person>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lv =(ListView) findViewById(R.id.lv); //初始化personList集合 initPerson(); //创建适配器 PersonAdapter personAdapter =new PersonAdapter(MainActivity.this, R.layout.person_item, personList); lv.setAdapter(personAdapter); } //初始化personList集合 private void initPerson() { // TODO Auto-generated method stub Person person=new Person(R.drawable.ic_launcher,"张三"); personList.add(person); Person person1=new Person(R.drawable.ic_launcher,"张飞"); personList.add(person1); Person person2=new Person(R.drawable.ic_launcher,"李阳"); personList.add(person2); Person person3=new Person(R.drawable.ic_launcher,"小王"); personList.add(person3); Person person4=new Person(R.drawable.ic_launcher,"老王"); personList.add(person4); Person person5=new Person(R.drawable.ic_launcher,"岳飞"); personList.add(person5); Person person6=new Person(R.drawable.ic_launcher,"赵四"); personList.add(person6); Person person7=new Person(R.drawable.ic_launcher,"刘能"); personList.add(person7); Person person8=new Person(R.drawable.ic_launcher,"谢广坤"); personList.add(person8); Person person9=new Person(R.drawable.ic_launcher,"小沈阳"); personList.add(person9); Person person10=new Person(R.drawable.ic_launcher,"孙悟空"); personList.add(person10); Person person11=new Person(R.drawable.ic_launcher,"猪八戒"); personList.add(person11); } }
(2)ListView的点击事件
ListView中的点击事件不能用setOnClickListener(),而是用setOnItemClickListener()。在我们获取到ListView组件之后,就可以给她添加点击事件了。
ListView lv =(ListView) findViewById(R.id.lv);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
Person person =personList.get(position);
//创建对话框
AlertDialog.Builder builder =new AlertDialog.Builder(MainActivity.this);
builder.setTitle("第"+position+"个条目被点击了");
builder.setMessage(person.getName()+",您好");
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "您点击了确认按钮", 0).show();
}
});
builder.setNegativeButton("退出", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "您点击了确认按钮", 0).show();
}
});
}
});