前回、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ファイル)に置く
その記述方法は、以下のリファレンスに書かれているとおり。
まず、データ置場として、/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」まで表示されます。
さらに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をレイアウト要素に配置した場合の画面
これまでのサンプルと少しレイアウトが変わります。
こちらの方が文字間の間隔も適度に空いていて見やすいですね。ただし、このレイアウトの違いがどこから影響を受けているのか、よく分かってないので、少し調べてみる必要があります。
【参考サイト】
コメント
コメントなどありましたら、GitHubのディスカッションへお願いします。(書き込みには、GitHubのアカウントが必要です)