2014-2-9AdapterView及其子类1!

0.      AdapterView组件是一组重要组件,AdapterView本身是一个抽象类,它派生的子类在用法上十分相似。AdapterView具有以下特征:

*AdapterView继承ViewGroup,本质是容器

*AdapterView可以包括多个“列表项”,并将多个“列表项”以合适的形式显示出来

*AdapterView显示的多个“列表项”由Adapter提供。调用AdapterViewsetAdapterAdapter)方法设置Adapter即可

AdapterView派生出三个子类:AbsListView、AbsSpinner和AdapterViewAnimator,这三个子类也是抽象类,实际使用时采用他们的子类。

1.      列表视图(ListView)和ListActivity

ListView以垂直列表的形式显示所有列表项。有以下两种形式创建:

       *直接使用ListView进行创建

       *让Activity继承ListActivity(相当于该Activity显示的组件为LiestView)

获得ListView后,就要为ListView设置它要显示的列表项。ListView表显示出AdapterView的特征:通过setAdapter(Adapte)方法为之提供Adapter、并由Adapter提供列表项。

实例:ListView

Xml代码清单

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- 直接使用数组资源给出列表项 -->
    <!-- 设置使用红色的分隔条 -->
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/books"
        android:divider="#080"
        android:dividerHeight="2px"
        android:footerDividersEnabled="false"   
        ></ListView>
</LinearLayout>

PS:android:entries指定了列表项数组,android:divider改变列表项之间的分隔条。

android:entries="@array/books"该属性用了数组资源,所以需定义一个books数组:

arrays.xml

<?xml version="1.0"encoding="utf-8"?>
<resources>
    <string-array name="books">
        <item>如何阅读一本书</item>
        <item>理想丰满</item>
        <item>拆掉思维的墙</item>
        <item>正能量</item>
        <item>遇见未知的自己</item>
        <item>做最好的自己</item>
    </string-array>
</resources>


2.    Adapter接口及实现类

Adapter本身只是一个接口,它派生了ListAdapterSpinnerAdapter两个接口,其中ListAdapter为AbsListView提供列表项,而SpinnerAdapter为AbsSpinner提供列表项。

在这两个类之下还有许多继承类,其常用实现类有:

*ArrayDapter:简单易用的Adapter,常用于数组或List集合的多个值包装成多个列表项

*SimpleAdapter:功能强大,用于将List集合的多个对象包装成多个列表项

*SimpleCursorAdapter:与SimpleAdapter相似,用于包装Cursor提供的数据

*BaseAdapter:常用于被扩展,可以对个列表项进行最大限度的定制

实例:用ArrayAdapter创建ListView

XML代码清单

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <!-- 设置使用红线的分隔条 -->
    <ListView
        android:id="@+id/list1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#f00"
        android:dividerHeight="2px"
        android:headerDividersEnabled="false"></ListView>
    <!-- 设置使用绿线的分隔条 -->
    <ListView
        android:id="@+id/list2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#0f0"
        android:dividerHeight="2px"
        android:headerDividersEnabled="false"></ListView>
</LinearLayout>

Java代码清单

packagecom.hqsA.arrayadaptert;
 
importandroid.os.Bundle;
importandroid.widget.ArrayAdapter;
importandroid.widget.ListView;
importandroid.app.Activity;
 
public classArrayAdapterT extends Activity {
 
    @Override
    protected void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.array_adapter_t);
        ListView list1 = (ListView) findViewById(R.id.list1);
        //定义一个数组
        String[] arr1 = {"中兴", "华为","酷派", "联想"};
                    //将数组包装为ArrayAdapter
        ArrayAdapter<String> adapter1 =new ArrayAdapter<String>
                    (this,R.layout.array_item, arr1);
        //为ListView设置Adapter
        list1.setAdapter(adapter1);
        ListView list2 = (ListView)findViewById(R.id.list2);
        //定义一个数组
        String[] arr2 = {"ZTE" ,"Huawei" , "Lenovo" , "Coolpad"};
                   //将数组包装为ArrayAdapter
        ArrayAdapter<String> adapter2 =new ArrayAdapter<String>
                    (this,R.layout.checked_item, arr2);
        //为ListView设置Adapter
        list2.setAdapter(adapter2);
    }
}

Ps:创建ArrayAdapter时必须指定三个参数:

*Context:它代表访问整个Android应用的接口,几乎创建所有组件都需要传入Context对象

*textViewResourceld:资源ID,该资源ID代表一个TextView,该TextView组件将作为ArrayAdapter的列表项组件

*数组或List:该数组或List为多个列表项提供数据

Array_item.xml代码清单

<?xml version="1.0"encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/TextView"
    android:textSize="24dp"
    android:padding="5px"
    android:shadowColor="#f0f"
    android:shadowDx="4"
    android:shadowDy="4"
    android:shadowRadius="2">
</TextView>

Check_item.xml布局文件与上面相似

效果:

3.    使用SimpleAdapter创建ListView

实例:

Xml代码清单

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <!-- 定义一个List -->
    <ListView android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

Java代码清单

public class SimpleAdapterT extends Activity {
 
    private String[] names = new String[]
            {"虎头", "弄玉" , "李清照" , "李白"};
    private String[] descs = new String[]
            {"可爱的小孩" , "一个擅长音乐的女孩"
            , "一个擅长文学的女性" , "浪漫主义诗人"};
    private int[] imageIds = new int[]
            {R.drawable.tiger , R.drawable.nongyu ,
            R.drawable.qingzhao , R.drawable.libai};
    @Override
    protected void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simple_adapter_t);
        //创建一个List集合,List集合的元素是Map
        List<Map<String , Object>>listItems=
                new ArrayList<Map<String ,Object>>();
        for(int i = 0 ;i < names.length ; i++)
        {
            Map<String, Object> listItem=new HashMap<String, Object>();
            listItem.put("header", imageIds[i]);
            listItem.put("personName", names[i]);
            listItem.put("desc", descs[i]);
            listItems.add(listItem);
        }
        //创建一个SimpleAdapter
        SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
                R.layout.simple_item,
                new String[]{"personName", "header", "desc"},
                new int[]{R.id.name, R.id.header, R.id.desc});
                ListView list = (ListView)findViewById(R.id.mylist);
        //为ListView设置Adapter
        list.setAdapter(simpleAdapter);
       
    }
}

PS:创建Simple对象需要5个参数,4个关键参数为:

第2个参数:该参数应为一个List<?extends Map<String,?>>类型的集合对象,该集合中每个Map<String,?>对象生成一个列表项

第3个参数:该参数指定一个布局界面ID。布局界面里定义组件来显示列表项。

第4个参数:该参数是一个String[]类型的参数,该参数决定提取Map<String,?>对象中的哪些key对应的value来生成列表项

第5个参数:int[]类型的参数,决定填充哪些组件。

Simple_item对应布局文件代码

<?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,用于作为列表项的一部分 -->
    <ImageView android:id="@+id/header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        />
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
        <!--定义一个TextView,用于作为列表项的一部分-->
        <TextView android:id="@+id/name"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textSize="20dp"
           android:textColor="#f0f"
           android:paddingLeft="10dp"
           />
        <TextView android:id="@+id/desc"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textSize="14dp"
           android:textColor="#f00"
           android:paddingLeft="10dp"
           />
    </LinearLayout>
</LinearLayout>

为上面Activity中的ListView绑定事件监听器

        

//为ListView的列表项的单击事件绑定事件监听器
        list.setOnItemClickListener(new OnItemClickListener()
        {
            //第position项被单击时激发该方法
            @Override
            public void onItemClick(AdapterView<?> parent,View view,
                    int position, long id)
            {
                System.out.println(names[position]
                        + "被单击了");
            }
        });
        //为ListView的列表项的选中事件绑定事件监听器
        list.setOnItemSelectedListener(new OnItemSelectedListener()
        {
            //第position项被选中时激发该方法
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                System.out.println(names[position] + "被选中了");
               
            }
 
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
               
            }
        });

运行效果:


*PS:选中事件无法发生,只有单击事件可以正常运行,不知道原因,可能是事件监听器的问题,以后要查找原因!

4.    扩展BaseAdapter实现ListView

Xml代码清单

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ListView
        android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</LinearLayout>

JAVA代码清单

public class BaseAdapterT extends Activity {
 
    ListView mylist;
    @Override
    protected voidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.base_adapter_t);
        mylist = (ListView) findViewById(R.id.mylist);
        BaseAdapter adapter = new BaseAdapter()
        {
 
            @Override
            public int getCount() {
                //指定一共包含40个选项
                return 40;
            }
 
            @Override
            public Object getItem(int position) {
                return null;
            }
            //重写该方法,该方法的返回值将作为列表项的ID
            @Override
            public long getItemId(int position) {
                return position;
            }
            //重写该方法,该方法返回的view将作为列表框
            @Override
            public View getView(int position, View convertView
                    , ViewGroup parent) {
                //创建一个LinearLayout,并向其中添加两个组件
                LinearLayout line = new LinearLayout(BaseAdapterT.this);
                line.setOrientation(0);
                ImageView image = new ImageView(BaseAdapterT.this);
                image.setImageResource(R.drawable.ic_launcher);
                TextView text = new TextView(BaseAdapterT.this);
                text.setText("第" + (position +1) + "个列表项");
                text.setTextSize(20);
                text.setTextColor(Color.RED);
                line.addView(image);
                line.addView(text);
                //返回LinearLayout实例
                return line;
               
            }
        };
        mylist.setAdapter(adapter);
    }
}


PS:创建一个BaseAdapter对象,需要重写如下4个方法:

    *getCount():返回值控制该Adapter将会包含多少个列表项

    *getItem(int position):该方法的返回值决定第position处的列表项内容

    *getItemId(int position):该方法返回值决定第position处的列表项ID

    *getView(int position, View convertView,ViewGroup parent):该方法的返回值决定第position处的列表项组件

       创建Adapter的四种方法:

       (1).ArrayAdapter          (2).基于ListView实现        

       (3).SimpleAdapter               (4).BaseAdapter

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章