【RecyclerView】リストの要素がひとつしか表示されない原因

やりたいこと

RecyclerViewのリストの要素がひとつしか表示されない問題を修正したい。

AAAAAという文字列だけでなく、BBBBB、CCCCC、DDDDD、EEEEEという文字列も渡しているのですが・・・。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initMenuAdapter()
}
private fun initMenuAdapter() { mainMenuList.layoutManager = LinearLayoutManager(activity) mainMenuList.adapter = MainMenuAdapter(createMainMenuTitles())
}
private fun createMainMenuTitles() = listOf("AAAAA", "BBBBB", "CCCCC", "DDDDD", "EEEEE")

 

対策

ViewHolderのViewを生成する際のレイアウトのlayout_heightmatch_parentになっている可能性があります。
これをwrap_contentに変えてみましょう。


参考
Recycler view showing single itemStack Overflow

結果

リストが表示されるようになりました!

ソースコード

MainFragment.kt

package katapiproject.practice
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.widget.LinearLayoutManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import katapiproject.practice.adapter.MainMenuAdapter
import kotlinx.android.synthetic.main.fragment_main.*
class MainFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_main, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initMenuAdapter() } private fun initMenuAdapter() { mainMenuList.layoutManager = LinearLayoutManager(activity) mainMenuList.adapter = MainMenuAdapter(createMainMenuTitles()) } private fun createMainMenuTitles() = listOf("AAAAA", "BBBBB", "CCCCC", "DDDDD", "EEEEE") companion object { fun newInstance() = MainFragment() }
}

 

fragment_main.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" android:orientation="vertical"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/mainMenuList" android:layout_width="match_parent" android:layout_height="wrap_content" /> </ScrollView>
</LinearLayout>

 

MainMenuAdapter.kt

package katapiproject.practice.adapter
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import katapiproject.practice.R
import katapiproject.practice.viewholder.MainMenuViewHolder
class MainMenuAdapter(private val titles : List<String>) : RecyclerView.Adapter<MainMenuViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainMenuViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.signle_list_item, parent, false) return MainMenuViewHolder(titles, view) } override fun getItemCount() = titles.size override fun onBindViewHolder(holder: MainMenuViewHolder, position: Int) { holder.bind(position) }
}

single_list.item.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="wrap_content" android:orientation="vertical" android:paddingBottom="16dp" android:paddingEnd="12dp" android:paddingStart="12dp" android:paddingTop="16dp"> <TextView android:id="@+id/listTitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16dp" />
</LinearLayout>

 

MainMenuViewHolder.kt

package katapiproject.practice.viewholder
import android.support.v7.widget.RecyclerView
import android.view.View
import kotlinx.android.synthetic.main.signle_list_item.view.*
class MainMenuViewHolder(private val titles: List<String>, itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(position: Int) { itemView.listTitle.text = titles[position] }
}