Spinner はただリスト項目を選択するだけではなく、画像とテキストをレイアウトすることも可能です。ListViewと同じようにadapterをカスタマイズして使い、ちょっとリッチなspinnerにすることもできます。
20212.1
Customized Spinner
Spinnerの基本については Spinner を参照ください。画像をSpinnerで表示することまではあまりないかもしれませんが、リスト要素のフォントやサイズ、背景色などちょっと変更したい場合は多々あります。
![[Android] Spinner をカスタマイズして画像リストを表示する 1x1.trans - [Android] Spinner をカスタマイズして画像リストを表示する](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
Adapterのカスタマイズ
作成手順としては基本のSpinnerと同じですが、カスタマイズするのはAdapterです。このあたりはListViewのAdapterのカスタマイズと同様です。
- 選択肢を設定する
- Spinnerのインスタンスを生成して、Adapterを設定
- 選択肢が選択された時の処理を記述
1. 画像とその名前を選択肢にします。画像の場合はdrawableに入れてそのresourceの画像名をリストにします。
2. TestAdapterというBaseAdapterを継承したAdapterクラスを作り、これをカスタマイズします。基本のSpinnerではデフォルトで設定されているレイアウトを使いましたが、レイアウトも自由にカスタマイズしていきます。
3. リスナーを設定して選択されたセルの位置を取得して画像を表示します。
@drawableに置いた画像をその名前から引き出すためにsetImageResource( Resource ID )を使います。
| 1 2 3 4 5 | imageView.setImageResource(     getResources().getIdentifier(spinnerImages[position],     "drawable",      getPackageName()) ); | 
サンプルコード
まとめると
MainActivity.java
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | //package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.Spinner; public class MainActivity extends AppCompatActivity {     private static final String[] spinnerItems = {             "Select", "Yuka", "Kurumi", "Mai", "Miki", "Saya",             "Toko", "Nagi", "Yuyu", "Yumiko", "Katakuriko" };     private static final String[] spinnerImages = {             "transparent", "yuka", "kurumi", "mai", "miki", "saya",             "toko", "nagi", "yuyu", "yumiko", "katakuriko" };     private ImageView imageView;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         imageView = findViewById(R.id.image_view);         Spinner spinner = findViewById(R.id.spinner);         TestAdapter adapter = new TestAdapter(this.getApplicationContext(),                 R.layout.list, spinnerItems, spinnerImages);         spinner.setAdapter(adapter);         // リスナーを登録         spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {             // アイテムが選択された時             public void onItemSelected(AdapterView<?> parent,                                        View viw, int position, long id) {                 imageView.setImageResource(getResources().                         getIdentifier(spinnerImages[position],                                 "drawable", getPackageName()));             }             // アイテムが選択されなかった             public void onNothingSelected(AdapterView<?> parent) {             }         });     } } | 
 
アダプタークラスのファイルを作成します
TestAdapter.java
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | //package your.package.name; import android.content.Context; import android.content.res.Resources; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class TestAdapter extends BaseAdapter {     private final LayoutInflater inflater;     private final int layoutID;     private final String[] names;     private final int[] imageIDs;     static class ViewHolder {         ImageView imageView;         TextView textView;     }     TestAdapter(Context context,                 int itemLayoutId,                 String[] spinnerItems,                 String[] spinnerImages ){         inflater = LayoutInflater.from(context);         layoutID = itemLayoutId;         names = spinnerItems;         imageIDs = new int[spinnerImages.length];         Resources res = context.getResources();         // 最初に画像IDを配列で取っておく         for( int i = 0; i< spinnerImages.length; i++){             imageIDs[i] = res.getIdentifier(spinnerImages[i],                     "drawable", context.getPackageName());         }     }     @Override     public View getView(int position, View convertView, ViewGroup parent) {         ViewHolder holder;         if (convertView == null) {             convertView = inflater.inflate(layoutID, null);             holder = new ViewHolder();             holder.imageView = convertView.findViewById(R.id.image_view);             holder.textView = convertView.findViewById(R.id.text_view);             convertView.setTag(holder);         } else {             holder = (ViewHolder) convertView.getTag();         }         holder.imageView.setImageResource(imageIDs[position]);         holder.textView.setText(names[position]);         return convertView;     }     @Override     public int getCount() {         return names.length;     }     @Override     public Object getItem(int position) {         return position;     }     @Override     public long getItemId(int position) {         return position;     } } | 
activty_main.xml
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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:background="#cfd"     android:orientation="vertical"     android:gravity="center_horizontal"     tools:context=".MainActivity">     <ImageView         android:id="@+id/image_view"         android:layout_width="160dp"         android:layout_height="160dp"         android:layout_marginTop="60dp"         android:contentDescription="@string/description"/>     <Spinner         android:id="@+id/spinner"         android:background="#8da"         android:layout_width="250dp"         android:layout_height="wrap_content"         android:layout_margin="20dp" /> </LinearLayout> | 
 
Spinnerで表示するリストのレイアウト
list.xml
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout     xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="horizontal"     android:background="#8da"     android:layout_width="match_parent"     android:layout_height="match_parent">     <ImageView         android:id="@+id/image_view"         android:scaleType="centerCrop"         android:layout_margin="5dp"         android:layout_width="40dp"         android:layout_height="40dp"         android:contentDescription="@string/description"/>     <TextView         android:id="@+id/text_view"         android:textColor="#000"         android:textSize="20sp"         android:layout_gravity="center_vertical"         android:layout_marginStart="30dp"         android:layout_width="wrap_content"         android:layout_height="wrap_content" /> </LinearLayout> | 
 
リソース
strings.xml
| 1 2 3 4 | <resources>     <string name="app_name">Your App Name</string>     <string name="description">photo</string> </resources> | 
サンプル動画
関連記事:
プルダウンで項目選択できるSpinnerをアプリに設定する
 
References:
Spinners
ArrayAdapter
