iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 25
0
自我挑戰組

向Android APP開發說Hello系列 第 25

Day 25. 定義自己的Layout應用於ArrayAdapter (Part.1)

Day24的應用中,我們建立的ArrayAdapter所使用的Layout,是Android預定義的android.R.layout.simple_list_item_1,Android framework中提供了很多Layout,官方文件R.layout給出了列表。

當然,我們也可以定義一個自己的Layout來配合ArrayAdapter,在Android Studio中,在左側目錄建立一個新的XML(res/layout > New > Layout resource file),取名為list_item.xml。

定義自己的Layout

在此list_item中,建立我們的Layout配置如下:

  • 增加一個命名空間xmlns:tools="http://schemas.android.com/tools"
  • 建立兩個TextView,給予各自id,並使用tools:text屬性
    • tools命名空間下提供了不同的屬性,tools:text屬於Design-time view attributes,意即我們只會在設計階段(在Android Studio Preview)時看到這些文字。
    • 實際上App運作時要顯示的文字,在java中動態設定即可。
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tortoises_text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:text="Cyclemys trifasciata"/>

    <TextView
        android:id="@+id/default_text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:text="金錢龜"/>

</LinearLayout>

https://ithelp.ithome.com.tw/upload/images/20181109/20107569IvgM1dTFuB.jpg

在ArrayAdapter使用自定義Layout

回到MainActivity.java中,查看Day24中建立的ArrayAdapter,將resource換成自定義Layout(list_item.xnl):

//ArrayAdapter<String> itemsAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, tortoises);

ArrayAdapter<String> itemsAdapter = new ArrayAdapter(this, R.layout.tortoises_text_view, list_item);

ListView listView = findViewById(R.id.list);
listView.setAdapter(itemsAdapter);

對ArrayAdapter同時傳入兩個資料來源

除了已建立的ArrayList tortoises外,若還想要傳入另一個ArrayList 給ArrayAdapter,作為tortoises內容的中文對照呢?
來看看ArrayAdapter的建構式為:
ArrayAdapter(Context context, int resource, List<T> objects)
顯然ArrayAdapter無法同時接受兩個String ArrayList,但我們可以定義自己的class,並實作object傳入。

定義class

在Android Studio右側新建一個java(路徑:java > New > Java Class),命名為NameMapping:

public class NameMapping {

    //烏龜的學名
    private String mTortoisesSciName;

    //烏龜的中文
    private String mTortoisesTwName;

    //建構式
    public NameMapping(String tortoisesSciName, String tortoisesTwName){
        mTortoisesSciName = tortoisesSciName;
        mTortoisesTwName = tortoisesTwName;
    }

    //方法1.傳回學名
    public String getTortoisesSciName(){
        return mTortoisesSciName;
    }

    //方法2.傳回中文名
    public String gettortoisesTwName(){
        return mTortoisesTwName;
    }
}

明天將繼續使用NameMapping class完成此項練習。


上一篇
Day 24. Android的Memory管理與View Recycling (Part.2)
下一篇
Day 26. 定義自己的Layout應用於ArrayAdapter (Part.2)
系列文
向Android APP開發說Hello30

尚未有邦友留言

立即登入留言