Spinnerで実行時エラー”ArrayAdapter requires the resource ID to be a TextView”が投げられる。

基本を疎かにするからヘボいところで引っかかるって話。
# 現象
## 空のSpinnerを表示してみる。
### ソース
```java:MainActivity.java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayAdapter adapter = new ArrayAdapter(this, R.layout.activity_main, list);
        Spinner spinner = (Spinner)findViewById(R.id.spinner);
        spinner.setAdapter(adapter);
    }
}
```
```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    tools:context=".MainActivity">
    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="208dp" />
</android.support.constraint.ConstraintLayout>
```
### 実行結果
エラーなく空のSpinnerが表示される。
よしよし。

## Spinnerに値を格納してみる。
### ソース
```java:MainActivity.java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayAdapter adapter = new ArrayAdapter(this, R.layout.activity_main, Arrays.asList("AA", "BB", "CC"));
        Spinner spinner = (Spinner)findViewById(R.id.spinner);
        spinner.setAdapter(adapter);
    }
}
```
```xml:activity_main.xml
変更なしなので省略
```

### 実行結果
`java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView`
`Caused by: java.lang.ClassCastException: android.support.constraint.ConstraintLayout cannot be cast to android.widget.TextView`

ファッ！？
なんじゃこりゃ？
TextViewが必要とか、TextViewがないからダメなんだよ、と言われていることは分かった。
ただ、別にTextViewなんていじってないし...
あたいはだたSpinnerに値を設定したいだけなのに...

# 原因
1. Spinnerはリストの要素のレイアウト(TextView)を指定する必要がある
1. 指定する箇所は`new ArrayAdapter(this, R.layout.activity_main, list)`の第2引数

根本的には、よくわからんまま`new ArrayAdapter(this, R.layout.activity_main, list)`の第2引数にactivity_mainを設定しているのが間違い。
そりゃあそうだよ。なんでここにactivity_mainを指定する必要があるんやろ？とあたいも思ったさ。でもまぁそういうもんなんだろうと流したのが間違いだった。
ちゃんとSpinnerの見た目を変えたいって需要を見越して要素のデフォルトレイアウトなんか持たずに、はじめっからレイアウトを手前ェで指定しろや！ってことなんでしょうねぇ。

# 解決
### ソース
```java:MainActivity.java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayAdapter adapter = new ArrayAdapter(this, R.layout.spinner_row, Arrays.asList("AA", "BB", "CC"));
        Spinner spinner = (Spinner)findViewById(R.id.spinner);
        spinner.setAdapter(adapter);
    }
}
```
```xml:activity_main.xml
変更なしなので省略
```
```xml:spinner_row.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
</TextView>
```
### 実行結果
出来はりましたわ...