こんにちは。
はじめに
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>
ちゃんと並びました。
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>
すると,
バナーが11個しか表示されなくなってしまいました。
ちなみに,ScrollView
と同じ階層に適当にTextView
を追加すると,要素がさらに一個減ります。
原因
しっかりと理解はできていないのですが,ScrollView
をNestedScrollView
に変更したら解決しました。
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>
おわり
しらないViewがいっぱいあるので,ひとつずつ印象に残して覚えていけたらなって思っています。