zoukankan      html  css  js  c++  java
  • Android UI学习

     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:
    
    
    @Override
    public 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. 使用ArrayAdapter
    
    
    public 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.NAME
    
    List3 - 使用SimpleCursorAdapter读取通讯录Phones,两行显示Item
    
    List4 - 使用自定义Adapter以及自定义ItemView
    
    List5 - 带有separator的ListView,通过自定义Adapter,重写boolean isEnabled(int position)
    
    List6 - 使用自定义Adapter以及自定义ItemView,可伸展隐藏内容
    
    List7 - 使用SimpleCursorAdapter读取数据
    
    List8 - 展现使用setEmptyView效果
    
    List9 - 涉及OnScrollListener
    
    List10 - ListItem为单选按钮
    
    List11 - ListItem为多选按钮
    
    List12 - 可以动态添加ListItem
    
    List13 - 如何加快操作显示,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
  • 相关阅读:
    86. Partition List
    328. Odd Even Linked List
    19. Remove Nth Node From End of List(移除倒数第N的结点, 快慢指针)
    24. Swap Nodes in Pairs
    2. Add Two Numbers(2个链表相加)
    92. Reverse Linked List II(链表部分反转)
    109. Convert Sorted List to Binary Search Tree
    138. Copy List with Random Pointer
    为Unity的新版ugui的Prefab生成预览图
    ArcEngine生成矩形缓冲区
  • 原文地址:https://www.cnblogs.com/qqhfeng/p/4472692.html
Copyright © 2011-2022 走看看