2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

消えたRecylerViewのitemたち

Posted at

こんにちは。

はじめに

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

最初の状態

とりあえずRecylerViewで,バナーを100個ならべてみます。

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
            }
        }
    }
}
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>

ちゃんと並びました。

image.png

RecyclerView以外の要素も一緒にスクロールできるようにする

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

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>

すると,
image.png
image.png
バナーが11個しか表示されなくなってしまいました。
ちなみに,ScrollViewと同じ階層に適当にTextViewを追加すると,要素がさらに一個減ります。
image.png

原因

しっかりと理解はできていないのですが,ScrollViewNestedScrollViewに変更したら解決しました。

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>
image.png image.png

おわり

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

参考リンク

https://qiita.com/unpi/items/aad4e21f3357a501194b

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?