Android_适配器(adapter)之ArrayAdapter

ArrayAdapter是一个很简单的适配器,是BaseAdapter的子类。

ArrayAdapter绑定的数据是集合或数组,比较单一。视图是列表形式,ListView 或 Spinner.

ArrayAdapter先看下它的构造方法有哪些,如下:

ArrayAdapter(Context context, int resource)
context:当前的上下文,不能为null
resource:布局的资源ID,实例化视图时使用的TextView

ArrayAdapter(Context context, int resource, int textViewResourceId)
context:同上,不能为null
resource:布局的资源ID,实例化视图时使用的layout
textViewResourceId:要填充的布局资源中的TextView的id

ArrayAdapter(Context context, int resource, T[] objects)
ArrayAdapter(Context context, int resource, List<T> objects)
context:同上,不能为null
resource:布局的资源ID,实例化视图时使用的TextView
objects:数据集合,不能为null

ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
context:同上,不能为null
resource:布局的资源ID,实例化视图时使用的layout
textViewResourceId:要填充的布局资源中的TextView的id
objects:数据集合,不能为null

说明:一共有6种构造方法,有两个几乎一致,所以分成上述4类。下面以第三类(3个参数)、第四类(4个参数)为例大致说明下。

直接用ListView,不构造ArrayAdapter

布局文件,array_adapter_act1.xml.直接在ListView写上数据。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/array_adapter_listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:entries="@array/array_adapter_strs"/>
</RelativeLayout>

数据数据如下:

    <string-array name="array_adapter_strs">
        <item>11</item>
        <item>22</item>
        <item>33</item>
        <item>44</item>
        <item>55</item>
    </string-array>

Activity调用如下:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.array_adapter_act1 );

        ListView listView = findViewById( R.id.array_adapter_listview );
        listView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d( TAG, "onItemClick: position="+ position + ";text=" + parent.getItemAtPosition(position).toString() );
            }
        } );
    }

效果如图,点击打印正常。如点击第一个,log:D/Adapter: onItemClick: position=0;text=11

ArrayAdapter(Context context, int resource, T[] objects)

布局array_adapter_act2.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/array_adapter_listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

Activity调用:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.array_adapter_act2);

        ListView listView = findViewById( R.id.array_adapter_listview );
        String[] datas = {"AA", "BB", "CC", "DD", "EE"};
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.array_adapter_item, datas);
        listView.setAdapter( adapter );
        listView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d( TAG, "onItemClick: position="+ position + ";text=" + parent.getItemAtPosition(position).toString() );
            }
        } );
    }

array_adapter_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="30dp"
    android:gravity="center">
</TextView>

效果如下图,点击第一个,log:D/Adapter: onItemClick: position=0;text=AA

说明:

1.注意最开始第二个参数的说明,这里需要一个实例化视图是TextView的布局。

2.系统已提供了几种item的样式(第二个参数,TextView布局),一般直接使用系统的即可,不需要自定义了。如:

android.R.layout.simple_list_item_1:单行的文本,效果如直接使用ListView的图一样(第一张图)。
android.R.layout.simple_list_item_checked:带选择标识的
simple_list_item_multiple_choice:带复选框

ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)

布局文件,array_adapter_act2.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/array_adapter_listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

Activity调用:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.array_adapter_act2);

        ListView listView = findViewById( R.id.array_adapter_listview );
        String[] datas = {"11AA", "22BB", "33CC", "44DD", "55EE"};
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.array_adapter_item2,
                R.id.array_adapter_text22, datas);
        listView.setAdapter( adapter );
        listView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d( TAG, "onItemClick: position="+ position + ";text=" + parent.getItemAtPosition(position).toString() );
            }
        } );
    }

array_adapter_item2.xml:

<?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="40dp">
    <TextView android:id="@+id/array_adapter_text22"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"/>
</LinearLayout>

效果如下图,点击第一个打印log:D/Adapter: onItemClick: position=0;text=11AA

注意:后面两类4个构造方法 带有数据objects的,T[] objects会使数据不可变,所以在使用clear() add()等方法时会报出异常。List<T> objects不会抛出异常。

ArrayAdapter是比较简单的 绑定单一数据的一种适配器,也可以自定义实现稍微复杂点的效果,但其他适配器可能更容易点^v^

猜你喜欢

转载自www.cnblogs.com/fanglongxiang/p/11722703.html