Android_適配器(adapter)之ArrayAdapter


ArrayAdapter是一個很簡單的適配器,是BaseAdapter的子類。

ArrayAdapter綁定的數據是集合或數組,比較單一。視圖是列表形式,ListView 或 Spinner.

 

ArrayAdapter先看下它的構造方法有哪些,如下6種:

ArrayAdapter(Context context, int resource)
context:當前的上下文,不能為null
resource:布局的資源ID,實例化視圖是TextView

ArrayAdapter(Context context, int resource, T[] objects)
ArrayAdapter(Context context, int resource, List<T> objects)
context:同上,不能為null
resource:布局的資源ID,實例化視圖是TextView
objects:數據集合,不能為null

上面3種,類似下面的示意圖。每一項布局文件就是一個textview, 數據直接填充到textview中,只是構造時數據源不同(不包含,數組或List)

ArrayAdapter(Context context, int resource, int textViewResourceId)
context:同上,不能為null
resource:布局的資源ID,包含一個textview
textViewResourceId:要填充的布局資源中的TextView的id

ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
context:同上,不能為null
resource:布局的資源ID,包含textview
textViewResourceId:要填充的布局資源中的TextView的id
objects:數據集合,不能為null

上面3種,類似下面的示意圖。每一項的布局文件中包含一個textview, 數據填充到指定的textview中,只是構造時數據源不同(不包含,數組或List)

說明:

一共有6種構造方法,大致分為了上述兩類。下面示例使用了第二個,第五個構造方法,都是數組形式的數據源

T[] objects和List<T> objects的區別:

T[] objects會使數據不可變,所以在使用clear() add()等方法時會報出異常。List<T> objects不會拋出異常,可以進行操作。

文章最后也對這個做示例詳細說明。

 

直接用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

 

 

T[] objects和List<T> objects兩種數據源的區別

最初已經講過了,T[] objects會使數據不可變,所以在使用clear() add()等方法時會報出異常。List<T> objects不會拋出異常,可以操作。

我們簡單一起來看下:

  • T[] objects類型數據源

     ListView listView = findViewById( R.id.array_adapter_listview );
        String[] datas = {"111", "222", "333"};
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas);
        listView.setAdapter( adapter );

 

上面代碼,是T[] objects類型數據源,會顯示3項單行,如圖

 如果,使用add() 或 clear等方法操作:

ListView listView = findViewById( R.id.array_adapter_listview );
        String[] datas = {"111", "222", "333"};
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas);
 adapter.add( "aaa" );         listView.setAdapter( adapter );

這樣就會報錯:

    java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.flx.adaptertest/com.flx.adaptertest.arrayadapter.ArrayAdapterActivity2}: java.lang.UnsupportedOperationException
  • List<T> objects類型數據源

ListView listView = findViewById( R.id.array_adapter_listview );
        List<String> datas = new ArrayList<>();
        datas.add("111");
        datas.add("222");
        datas.add("333");
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas);
        listView.setAdapter( adapter );

上述代碼,如T[] objects類型數據源效果一樣,不截圖了。

使用add()等方法操作會怎樣呢?

ListView listView = findViewById( R.id.array_adapter_listview );
        List<String> datas = new ArrayList<>();
        datas.add("111");
        datas.add("222");
        datas.add("333");
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas);
        adapter.add("aaa");
        listView.setAdapter( adapter );
        adapter.add("bbb");

效果如下:

 操作正常完成。

 

 

ArrayAdapter是比較簡單的 綁定單一數據的一種適配器,也可以自定義實現稍微復雜點的效果,但其他適配器可能更容易點^v^

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM