消えたRecylerViewのitemたち

こんにちは。

# はじめに
Androidアプリを作成していたら，
RecyclerViewのアイテムの個数が，自分の思ってた数よりも小さくなってしまう現象が起きたので記事にまとめておこうと思いました。

## 最初の状態
とりあえずRecylerViewで，バナーを100個ならべてみます。

```kotlin:DebugActivity.kt
class DebugActivity : AppCompatActivity() {
    private data class Banner(
        val index: String?,
        val title: String?
    )

    private var bannerArrayList: ArrayList<Banner> = arrayListOf()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        this.setContentView(R.layout.activity_debug)

        debug_recycler.layoutManager = LinearLayoutManager(this)
        val adapter = DebugListItemAdapter(bannerArrayList)

        for (i in 1..100) {
            bannerArrayList.add(
                Banner(
                    i.toString(), "DEBUG"
                )
            )
        }

        debug_recycler.adapter = adapter
    }

    private inner class DebugListItemAdapter internal constructor(private val banners: ArrayList<Banner>) : RecyclerView.Adapter<DebugListItemAdapter.DebugListItemViewHolder>() {
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DebugListItemViewHolder {
            return DebugListItemViewHolder(
                LayoutInflater.from(parent.context)
                    .inflate(R.layout.banner_item, parent, false)
            )
        }

        override fun onBindViewHolder(holder: DebugListItemViewHolder, position: Int) {
            holder.chooseBanner(banners[position])
        }

        override fun getItemCount(): Int {
            return banners.size
        }

        private inner class DebugListItemViewHolder internal constructor(view: View) : RecyclerView.ViewHolder(view) {
            private val index: TextView? = view.findViewById(R.id.banner_number_index)
            private val title: TextView? = view.findViewById(R.id.banner_title)

            internal fun chooseBanner(banner: Banner) {
                index?.text = banner.index
                title?.text = banner.title
            }
        }
    }
}
```

```xml:activity_debug.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/debug_recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_between_banner"
        android:nestedScrollingEnabled="false"/>

</LinearLayout>
```

ちゃんと並びました。

<img width="306" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/2ec053f7-64bf-7ffb-6ac4-f57cd921584c.png">

## RecyclerView以外の要素も一緒にスクロールできるようにする
今の状態だとRecyclerViewの要素しかスクロールされません。
なので，`ScrollView`を使って，他の要素も一緒にスクロールできるようにしてみたいと思います。

```xml:activity_debug.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="デバッグ"
                android:textSize="@dimen/activity_subtitle_text_size"
                android:textColor="#ffffff"
                fontPath="fonts/NotoSansJP-Bold.otf"
                tools:ignore="MissingPrefix" />

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/debug_recycler"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/margin_between_banner"
                android:nestedScrollingEnabled="false"/>

        </LinearLayout>

    </ScrollView>

</LinearLayout>
```
すると，
<img width="299" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/6124c2f3-5ed3-1c19-e119-361b683d0f61.png">
<img width="313" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/97a0f450-9633-0d1c-168e-c22d2bf47bd5.png">
バナーが11個しか表示されなくなってしまいました。
ちなみに，`ScrollView`と同じ階層に適当に`TextView`を追加すると，要素がさらに一個減ります。
<img width="316" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/ad8a1608-2ce5-c55f-d117-de848ff6898b.png">

# 原因
しっかりと理解はできていないのですが，`ScrollView`を`NestedScrollView`に変更したら解決しました。

```xml:activity_debug.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="スクロールしません" />

    <androidx.core.widget.NestedScrollView
        android:overScrollMode="never"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="デバッグ"
                android:textSize="@dimen/activity_subtitle_text_size"
                android:textColor="#ffffff"
                fontPath="fonts/NotoSansJP-Bold.otf"
                tools:ignore="MissingPrefix" />

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/debug_recycler"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/margin_between_banner"
                android:nestedScrollingEnabled="false"/>

        </LinearLayout>

    </androidx.core.widget.NestedScrollView>

</LinearLayout>
```
<img width="308" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/2fa64b76-c2a7-f7eb-e734-19c21531d14c.png">
<img width="304" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/25227549-260c-beae-1b40-c2786599da0f.png">

# おわり
しらないViewがいっぱいあるので，ひとつずつ印象に残して覚えていけたらなって思っています。

# 参考リンク
> https://qiita.com/unpi/items/aad4e21f3357a501194b