Android UI学习 - ListView 2010-06-20 18:21:35 标签:Android  UI 移动开发 ListView  ListActivity  原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://android.blog.51cto.com/268543/336162  ListActivity    ListActivity是一个专门显示ListView的Activity类,它内置了ListView对象,只要我们设置了数据源,就会自动地显示出来。 使用custom view for screen layout     虽然ListActivity内置了ListView对象,但我们依然可以使用custom view,通过在onCreate()里面调用setContentView(resources id)。    不过要注意的是,在自定义的Layout里面,要设置ListView对象的id为"@android:id/list";在Java代码里使用android.R.id.list。    下面的例子,通过添加一个id为android:empty的TextView,当ListView里面没有data的时候,就会显示"No data"。nodata    自定义的View (listview.xml):<?xml version="1.0" encoding="utf-8"?><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="fill_parent"                 android:layout_height="fill_parent"                 android:layout_weight="1"         />         <TextView android:id="@id/android:empty"                 android:layout_width="fill_parent"                 android:layout_height="wrap_content"                 android:text="No data"                 android:textColor="#ff0000"         /></LinearLayout>    加载Layout:@Overridepublic void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.listview);         //没有设置data source } Row Layout官方提供了多种ListItem的Layout (R.layout),以下是较为常用的,更多的请查看API DOC的R.layout http://androidappdocs.appspot.com/reference/android/R.layout.html:◾android.R.layout.simple_list_item_1   一行text◾android.R.layout.simple_list_item_2   一行title,一行text◾android.R.layout.simple_list_item_single_choice   单选按钮◾android.R.layout.simple_list_item_multiple_choice   多选按钮◾android.R.layout.simple_list_item_checked    checkbox我们可以自定义自己的Layout (list_item.xml):<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"         android:orientation="horizontal"         android:layout_width="fill_parent"         android:layout_height="fill_parent">         <ImageView android:id="@+id/icon"                 android:layout_width="48dip"                 android:layout_height="48dip" />         <TextView android:id="@+id/text"                 android:layout_gravity="center_vertical"                 android:layout_width="0dip"                 android:layout_weight="1"                 android:layout_height="wrap_content" /></LinearLayout> 使用时,以R.layout.list_item引用就行了。可以参考http://androidappdocs.appspot.com/resources/tutorials/views/hello-listview.html。 绑定数据    通过调用SetListAdapter(ListAdapter adapter)就可实现。我们可以implements ListAdapter来自定义自己的数据源。API内置了几个implements ListAdapter的Adapter:BaseAdapter,SimpleAdapter (以Map的形式存储静态数据),SimpleCursorAdapter (用于游标查询的结果)等等。通常我们更多地extends BaseAdapter来编写自己的Adapter类,因为BaseAdapter类是其他Apdater类的基类。扩展BaseAdapter类一般都需要重写以下方法:    int     getCount()                   获取当前Adapter的Items数目    Object getItem(int position)     获取相应position的Item    long     getItemId(int position)  获取相应position的Item在List中的row id    View    getView(int position, View convertView, ViewGroup parent) 获取在指定position所要显示的data的View    详细内容可以查看BaseAdapter类的继承android.widget.Adapter的方法,有时也需要重写ListAdapter的boolean     isEnabled(int position)来实现某些效果。    接下来看看几个绑定数据的例子:    1. 使用ArrayAdapterpublic void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         //参考ArrayAdapter的构造函数        setListAdapter(new ArrayAdapter<String>(this,                         android.R.layout.simple_list_item_1,                         mStrings));         //在ListView上输入字母,就会自动筛选出以此内容开头的Item         getListView().setTextFilterEnabled(true); }private String[] mStrings = {"A", "Android", "机器人", "Google"};ArrayAdapter ArrayAdapter     2. 使用SimpleCursorAdapter    这是Sample里面List3例子,通过读取通讯录android.provider.Contacts.Phones的资料,显示出来。protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         // Get a cursor with all phones         Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null);         startManagingCursor(c);                  // Map Cursor columns to views defined in simple_list_item_2.xml         ListAdapter adapter = new SimpleCursorAdapter(this,                         android.R.layout.simple_list_item_2, c,                                          new String[] { Phones.NAME, Phones.NUMBER },                                          new int[] { android.R.id.text1, android.R.id.text2 });         setListAdapter(adapter); }     3. ListItem为单选按钮public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         //参考ArrayAdapter的构造函数        setListAdapter(new ArrayAdapter<String>(this,                         android.R.layout.simple_list_item_single_choice,                         mStrings));         final ListView listView = getListView();         listView.setItemsCanFocus(false);         listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); //设置单选模式}private String[] mStrings = {"A", "Android", "机器人", "Google"};singliechoice singliechoice     4. ListItem为多选按钮    把例子3的设置为android.R.layout.simple_list_item_multiple_choice以及选择模式ListView.CHOICE_MODE_MULTIPLE。 更多的例子可以参考官方的Sample,在此列出相关List的示例说明:List1 - 使用ArrayAdapter并setTextFilterEnabled(true)List2 - 使用SimpleCursorAdapter读取通讯录People.NAMEList3 - 使用SimpleCursorAdapter读取通讯录Phones,两行显示ItemList4 - 使用自定义Adapter以及自定义ItemViewList5 - 带有separator的ListView,通过自定义Adapter,重写boolean isEnabled(int position)List6 - 使用自定义Adapter以及自定义ItemView,可伸展隐藏内容List7 - 使用SimpleCursorAdapter读取数据List8 - 展现使用setEmptyView效果List9 - 涉及OnScrollListenerList10 - ListItem为单选按钮List11 - ListItem为多选按钮List12 - 可以动态添加ListItemList13 - 如何加快操作显示,during scrolls or flings的时候List14 - 如何编写高效的List Adapter 其中List14,官方告诉我们:To work efficiently the adapter implemented here uses two techniques: * - It reuses the convertView passed to getView() to avoid inflating View when it is not necessary * - It uses the ViewHolder pattern to avoid calling findViewById() when it is not necessary 还告诉了我们ViewHolder类的作用: * The ViewHolder pattern consists in storing a data structure in the tag of the view returned by * getView(). This data structures contains references to the views we want to bind data to, thus * avoiding calls to findViewById() every time getView() is invoked.     另外在以上的例子里面了解到,使用自定义Adapter,当数据发生变化后需要调用notifyDataSetChanged()来刷新ListView,但在List12的例子,使用ArrayAdapter却没有调用这方法,而随后自己写代码,在发生的异常里面了解到BaseAdapter,ArrayAdapter是会调用自己的notifyDataSetChanged()。可以查看后面的文章《有关Android线程的学习》里面的例子!  ListView的事件响应    通常我们响应ListItem的点击事件:protected void onListItemClick(ListView l, View v, int position, long id) ,在此不详细讲了,理解该函数里面的参数意义就行了。本文出自 “学习Android” 博客,请务必保留此出处http://android.blog.51cto.com/268543/336162

更多相关文章

  1. android开发积累4-android使用HttpURLConnection访问网络
  2. Android(安卓)NDK学习 Android.mk实例和NDK实用技巧
  3. android ndk 使用第三方静态库
  4. 50个安卓开发者应该熟悉的Android(安卓)Studio技巧和资源
  5. [Android]定制RadioButton样式
  6. Android中ExpandableListView的使用
  7. Freeline 一款 Android平台上的秒级编译方案
  8. 开源终端Android(安卓)Terminal Emulator
  9. CoordinatorLayout使用自定义Behavior实现UC浏览器顶栏效果

随机推荐

  1. socket连接
  2. android fragment ,listview 嵌套横向Hori
  3. Android(安卓)版本(列表)
  4. Android的OkHttp包中的HTTP拦截器Interce
  5. Using WebViews and JavaScript
  6. 【转】Android --权限大全
  7. Android之离线词典
  8. android 模拟器使用指导
  9. Android SDK Manager安装过程
  10. Android SDK 源码