この間はsimple_list_item_1を使ったリストビューのことを書いたので、今度はsimple_list_item_2を使うリストビューの使い方。
(前回の記事:Android ListViewを使う(simple_list_item_1))
今回も地方(地域)リストでサンプルを作りました。
TextViewが2行のリスト
simple_list_item_2はTextViewが2つ縦に並んだシンプルなものです。
上に地方(地域)名、下に地方(地域)コードを表示、選択したら選択した地域に対応するコードをトーストするサンプルです。
レイアウト
レイアウトは前回と同じ。
activity_main.xml
<RelativeLayout 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" tools:context=".MainActivity"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/listView" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
コード
前回作成した地方(地域)クラスをそのまま使うので準備します。
Region.java
public class Region { private int code; private String name; Region(int code, String name){ this.code = code; this.name = name; } public int getCode(){ return code; } public String getName(){ return name; } @Override public String toString(){ return String.valueOf(code) + ":" + name; } }
今回はtoString()をオーバーライドしなくても大丈夫ですが、そのまま持ってきました。
ArrayAdapterを継承して、RegionAdapterを作成します。
RegionAdapter.java
public class RegionAdapter extends ArrayAdapter<Region> { private LayoutInflater mLayoutInflater; public RegionAdapter(Context context, List<Region> objects){ super(context, 0, objects); mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent){ View view = convertView; if(convertView == null){ view = mLayoutInflater.inflate(android.R.layout.simple_list_item_2, null); } Region region = getItem(position); TextView textView1 = (TextView) view.findViewById(android.R.id.text1); TextView textView2 = (TextView) view.findViewById(android.R.id.text2); textView1.setText(region.getName()); textView2.setText("code:" + String.valueOf(region.getCode())); return view; } }
ArrayAdapterのコンストラクタはArrayAdapter(Context context, int resource, List objects)だったのですが、今回はsimple_list_item_2しか使わないので省きました。
simple_list_item_2じゃなくて、オリジナルのリストアイテムを使う場合も同様。
getViewをオーバーライドするこのやり方が一般的?で検索でも良く見かけます。
パフォーマンスがあまり良くないらしく、大量のリスト場合はview holderを使う方法などもあるようです。自分が作ったアプリはこれと同じような実装をしています。
simple_list_item_2のTextViewのidはtextView1とtextView2で、それぞれsetTextで名前とコード(code:?)が表示されるようにセットしています。
アクティビティのコードは、前回ArrayAdapterだった場所を今回作成した独自アダプタにするだけです。
MainActivity.java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); List<Region> regionList = new ArrayList(); regionList.add(new Region(1,"北海道")); regionList.add(new Region(2,"東北")); regionList.add(new Region(3,"関東")); regionList.add(new Region(4,"中部")); regionList.add(new Region(5,"近畿")); regionList.add(new Region(6,"中国")); regionList.add(new Region(7,"四国")); regionList.add(new Region(8,"九州")); RegionAdapter adapter = new RegionAdapter(this, regionList); ListView lv = (ListView) findViewById(R.id.listView); lv.setAdapter(adapter); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListView listView = (ListView) parent; Region region = (Region) listView.getItemAtPosition(position); Toast.makeText(getApplicationContext(), String.valueOf(region.getCode()), Toast.LENGTH_SHORT).show(); } }); }
実行結果
まとめ
今回はArrayAdapterの継承で作ったけど、BaseAdapterを継承して作る人もいるみたい。
カッコイイアプリを作るならオリジナルリストアイテムを作らないと良い物は作れませんが、シンプルでコードもあまり書きたくないって言う人にはsimple_list_item_1と2はオススメだと思います。
ただsimple_list_item_2はTwoLineListItemを使っているんだけど、TwoLineListItemはAndroid4.2(API17)で廃止されました。とか公式に書かれていたりするのが気になる。
TwoLineListItem
http://developer.android.com/intl/ja/reference/android/widget/TwoLineListItem.html
This class was deprecated in API level 17.
This class can be implemented easily by apps using a RelativeLayout or a LinearLayout.
Android Studioのレイアウトの画面のDesignタブでも、PaletteのTwoLineListItemの所は取り消し線になっていて、カーソルを合わせると上の文章と似たようなことが出てきます。
オリジナルでリストアイテムを作る時は、使わないようにした方が良さそうですね。
コメント