Mono Works

チラシのすきま

メモ:ListViewのデータを実行ファイルの外に置く

前回、ListViewを使ってリスト表示する際に、表示する「データ」を実行ファイルの中に記述していましたが、今回は、この「データ」部分を実行ファイルの外に記述する方法について、メモしておきたいと思います。

メモ:ListViewと ArrayAdapterでスクロールするリスト表示 - Mono Works

さっそくですが、こちらが前回サンプルで作った実行ファイルです。

前回サンプルで作った実行ファイル

実行ファイル:MainActivity.java

package jp.co.monoworks.listviewsample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);</br>  String[] moji0140 = {
                "data01", "data02", "data03", "data04", "data05", "data06",
                "data07", "data08", "data09", "data10", "data11", "data12",
                "data13", "data14", "data15", "data16", "data17", "data18",
                "data19", "data20", "data21", "data22", "data23", "data24",
                "data25", "data26", "data27", "data28", "data29", "data30",
                "data31", "data32", "data33", "data34", "data35", "data36",
                "data37", "data38", "data39", "data40" };</br>  ArrayAdapter<CharSequence> adapter =
                new ArrayAdapter<CharSequence>(this, R.layout.activity_main, moji0140);</br>  ListView list =  new ListView(this);
        list.setAdapter(adapter);
        setContentView(list);
    }
}

上記実行ファイル中の String[] moji0140 = ~ で定義した「データ」部分を実行ファイルの外に置きます。

String Arrayを使ってリソースを実行ファイルの外(xmlファイル)に置く

その記述方法は、以下のリファレンスに書かれているとおり。

文字列リソース  |  Android Developers

まず、データ置場として、/res/values/配下に適当なファイル名でxmlファイルを新規作成して、下記のフォーマットでデータを記述します。重要なのは「データ群の名前」です。この名前を後から実行ファイル内に記述します。

<resources>
  <string-array name="データ群の名前">
    <item>表示するデータ1</item>
    <item>表示するデータ2</item></string-array>
</resources>

前回表示したデータをこのフォーマットで書くと、下記のようになります。ファイル名は、lists.xmlとしてますが、ファイル名自体は適当で構いません。

lists.xml

<resources>
    <string-array name="listData">
        <item>data01</item>
        <item>data02</item><item>data39</item>
        <item>data40</item>
    </string-array>
</resources>

xmlに記述した「データ群の名前」で参照して、データを取得する

前回作ったサンプルの「データ」部分を下記フォーマットの「データ参照」コードに置き換えます。

Resources res = getResources();

String[] データの名前 = res.getStringArray(R.array.データ群の名前);

具体的には

String[] moji0140 = {
    "data01", "data02", "data03", "data04", "data05", "data06",
    "data07", "data08", "data09", "data10", "data11", "data12",
    "data13", "data14", "data15", "data16", "data17", "data18",
    "data19", "data20", "data21", "data22", "data23", "data24",
    "data25", "data26", "data27", "data28", "data29", "data30",
    "data31", "data32", "data33", "data34", "data35", "data36",
    "data37", "data38", "data39", "data40" };

↑ の「データ」部分を ↓ の「データ参照」コードに置き換えます。

Resources res = getResources();
String[] moji0140 = res.getStringArray(R.array.listData);

なお、リファレンスに載っている上記お手本は、下記のように一行にまとめて記述することもできます。

String[] moji0140 = getResources().getStringArray(R.array.listData);

記述のまとめ

データファイル:lists.xml(今回、新規に作成)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="listData">
        <item>data01</item>
        <item>data02</item><item>data39</item>
        <item>data40</item>
    </string-array>
</resources>

レイアウトファイル:activity_main.xml(前回と変わらず)

<TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" />

実行ファイル:MainActivity.java(データ部分を参照コードに置き換え)

package jp.co.monoworks.listviewsample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Resources res = getResources();
    String[] moji0140 = res.getStringArray(R.array.listData);

    ArrayAdapter<CharSequence> adapter =
        new ArrayAdapter<CharSequence>(this, R.layout.activity_main, moji0140);

    ListView list =  new ListView(this);
    list.setAdapter(adapter);
    setContentView(list);
  }
}

実際に表示される画面

前回作成したものと変わりはありませんが、念のため掲載しておきます。もちろん実施の画面はスクロールして「data40」まで表示されます。

androiddevmemo20150917_01

さらにListViewをレイアウト要素へ置き換えると

ArrayAdapterすら必要がなくなり、こんな簡素な記述になります。

データファイル:lists.xml(先ほどと変わらず)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="listData">
        <item>data01</item>
        <item>data02</item><item>data39</item>
        <item>data40</item>
    </string-array>
</resources>

レイアウトファイルにListViewを配置して、「android:entries="@array/データ群の名前"」でデータ群の場所を指定します。

レイアウトファイル:activity_main.xml(ListViewを配置して xmlのデータ参照へ変更)

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:entries="@array/listData"/>

実行ファイルでは、レイアウトファイルを指定するだけになるので、こんなにシンプルになります。

実行ファイル:MainActivity.java(レイアウトファイルの指定のみに変更)

package jp.co.monoworks.listviewsample2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

ListViewをレイアウト要素に配置した場合の画面

これまでのサンプルと少しレイアウトが変わります。

androiddevmemo20150917_02

こちらの方が文字間の間隔も適度に空いていて見やすいですね。ただし、このレイアウトの違いがどこから影響を受けているのか、よく分かってないので、少し調べてみる必要があります。

【参考サイト】

ListView | Android Developers

String Resources | Android Developers

コメント

コメントなどありましたら、GitHubのディスカッションへお願いします。(書き込みには、GitHubのアカウントが必要です)
執筆者
"ぽぽろんち" @pporoch
pporoch120
Mono Worksの中の人。好きなことをつらつらと書き留めてます。
ギターを始めてから 練習動画をYouTubeにアップしてます。ご笑納ください。
"DQX@ぬここ(UD487-754)、コツメ(NO078-818)"
採用案内