##はじめに
ListViewが以下のように複数のリストがあるときに、タッチしたリストによって処理を変える方法です。
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/food"
android:id="@+id/food"></ListView>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/drink"
android:id="@+id/drink"></ListView>
##コード
フードのリストをタッチしたときは「あなたが選んだ食べ物は○○」、
ドリンクのリストをタッチしたときは「あなたが選んだ飲み物は○○」と表示されるトーストを作ってみます。
strings.xml
<resources>
<string name="app_name">ListView</string>
<string name="text_food">フード</string>
<string name="text_drink">ドリンク</string>
<string-array name="food">
<item>肉</item>
<item>魚</item>
</string-array>
<string-array name="drink">
<item>ジュース</item>
<item>お茶</item>
</string-array>
</resources>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/text_food"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/food"
android:id="@+id/food"></ListView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/text_drink"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/drink"
android:id="@+id/drink"></ListView>
</LinearLayout>
MainActivity.java
package com.websarva.wings.android.listview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView foodListView = findViewById(R.id.food);
ListView drinkListView = findViewById(R.id.drink);
foodListView.setOnItemClickListener(new ListItemClickListener());
drinkListView.setOnItemClickListener(new ListItemClickListener());
}
/**
* ListView内のitem押下時の処理
*/
private class ListItemClickListener implements AdapterView.OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
ListView foodList = findViewById(R.id.food);
ListView drinkList = findViewById(R.id.drink);
String item = (String) parent.getItemAtPosition(position);
String show;
if(parent == foodList){
show = "あなたが選んだ食べ物は" + item;
Toast.makeText(MainActivity.this,show,Toast.LENGTH_LONG).show();
}
if (parent == drinkList){
show = "あなたが選んだ飲み物は" + item;
Toast.makeText(MainActivity.this,show,Toast.LENGTH_LONG).show();
}
}
}
}
##実行結果
左で表示されているトーストは肉をタッチしたので、「あなたが選んだ食べ物は○○」が表示、
右で表示されているトーストはジュースをタッチしたので、「あなたが選んだので、飲み物は○○」
が表示されています。
##解説
private class ListItemClickListener implements AdapterView.OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
ListView foodList = findViewById(R.id.food); ・・・➀
ListView drinkList = findViewById(R.id.drink); ・・・➀
String item = (String) parent.getItemAtPosition(position);
String show;
if(parent == foodList){ ・・・➁
show = "あなたが選んだ食べ物は" + item;
Toast.makeText(MainActivity.this,show,Toast.LENGTH_LONG).show();
}
if (parent == drinkList){ ・・・➁
show = "あなたが選んだ飲み物は" + item;
Toast.makeText(MainActivity.this,show,Toast.LENGTH_LONG).show();
}
}
}
###➀ListViewのIDを取得する
どのリストがタッチされたか判別するために、findViewByIdメソッドを使用して各ListViewのIDを取得する。
###➁タッチされたListViewによって、処理を変える
➀で取得したIDをparentと比較して、タッチされたListViewを判別して、処理を実行する。
※parentはタッチされたリスト全体。