说明:
视图列表(ListView和ListActivity)与AutoComplete、Spinner类似,它们都需要一个供显示的列表项,可以需要借助于内容Adapter提供显示列表项
创建ListView有两种方式:
(1)直接使用ListView进行创建
(2)Activity继承ListActivity
ListView的常用XML属性
下面分别用两种方式创建ListView
方式一:直接使用ListView进行创建
(1) main_activity.xml
下面布局两个listView,一个基于数组,一个基于Adapter
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearlayout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:entries="@array/language" /> <TextView android:layout_width="fill_parent" android:layout_height="30dp"/> <ListView android:id="@+id/listView2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:headerDividersEnabled="true" android:footerDividersEnabled="true" android:divider="@drawable/img02"/> </LinearLayout>
(2) strings.xml 存放listView1内容数组
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">ListView</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string-array name="language"> <item>汉语</item> <item>韩语</item> <item>英语</item> <item>日语</item> <item>葡语</item> <item>俄语</item> </string-array> </resources>
(3) MainActivity.java
步骤:
1、获取布局ListView
2、封装显示内容list或数组
3、构建适配器Adapter
4、给ListView添加适配器
package com.example.listview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends Activity { private ListView listView2 = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取ListView listView2 = (ListView) findViewById(R.id.listView2); //定义数组 String arr[] = new String[]{"中国","韩国","日本","美国","葡萄牙","俄罗斯"}; //声明适配器 //this 上下文 //android.R.layout.simple_list_item_checked 列表样式 //arr 显示内容 (数组或list集合) ArrayAdapter<String > arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked, arr); //listView添加适配器 listView2.setAdapter(arrayAdapter); listView2.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.i("listView", parent.getItemAtPosition(position).toString()); } }); } }
运行效果如下:
如果想要自定义列表,列表项显示多个组件。我们可以用SimpleAdapter来自定义我们的列表。
(1) main_activity.xml
布局了ImageView,TextView 组件,用于显示列表内容
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearlayout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/img" android:layout_width="50dp" android:layout_height="65dp"/> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="100dp" android:layout_marginTop="30dp" /> <TextView android:id="@+id/phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:layout_marginLeft="150dp" /> </LinearLayout> </LinearLayout>
(2)MainActivity.java 步骤与上面的一样
package com.example.listviews; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.widget.ListView; import android.widget.SimpleAdapter; public class MainActivity extends Activity { private ListView listView = null; //定义ListView组件 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取listView组件 listView = (ListView) findViewById(R.id.listView); //初始化基础数据 String name[] = new String[]{"张三","李四","王五","张飞"}; String phone[] = new String[]{"14313426573","15908263541","18012345678","13423456789"}; int img [] = new int[]{R.drawable.name01,R.drawable.name02,R.drawable.name03,R.drawable.name04}; //封装list集合数据 List<Map<String,Object>> list = new ArrayList<Map<String,Object>>(); for(int i=0;i<name.length;i++){ Map<String,Object> listItem = new HashMap<String, Object>(); listItem.put("img", img[i]); listItem.put("name", name[i]); listItem.put("phone", phone[i]); list.add(listItem); } //配置SimpleAdapter适配器 //this 上下文 //R.layout.activity_main 布局文件 //new String[]{"img","name","phone"} 列表内容key //new int[]{R.id.img,R.id.name,R.id.phone} 用于显示内容的布局组件 SimpleAdapter simpleAdapter = new SimpleAdapter(this, list, R.layout.activity_main, new String[]{"img","name","phone"}, new int[]{R.id.img,R.id.name,R.id.phone}); //添加适配器 listView.setAdapter(simpleAdapter); } }
运行效果如下:
除了SimpleAdapter之外,我们还可以重写BaseAdapter的getView方法作为列表的列表项 。 有兴趣的同学可以动手写写BaseAdapter
方式二:Activity继承ListActivity
注意:
ListActivity的默认布局由一个位于屏幕中心的全屏列表构成。如果你不想使用默认的布局,可以在onCreate()方法中通过setContentView()方法设定你自己的布局。如果指定你自己定制的布局,你的布局中必须包含一个id为"@id/android:list"的ListView。 若你还指定了一个id为"@id/android:empty"的view,当ListView中没有数据要显示时,这个view就会被显示,同时ListView会被隐藏
(1)main_activity.xml
布局了一个ListView和TextView,TextView的id为@id/android:empty,当ListView中没有数据要显示时,这个TextView就会被显示
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/android:list" android:layout_width="match_parent" android:layout_height="match_parent"/> <TextView android:id="@android:id/empty" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FF0000" android:text="No data"/> </LinearLayout>
(2) MainActivity.java
package com.example.listactivity; import android.app.ListActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String arr[] = new String[]{"中国","韩国","日本","美国","葡萄牙","俄罗斯"}; //设置适配器 ArrayAdapter<String > arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked, arr); //给ListActivity添加适配器 setListAdapter(arrayAdapter); } }
如果ListView没有内容,则显示TextView。如下
方式一和方式二的效果完全一样,不同的是,一个给ListView组件添加适配器,一个给ListActivity类添加适配器而已。