###問題
ヘッダーフッターを付けたいと思い、以下のクラスを作成しました。
使用する際はこのクラスを継承したAdapterを作成すれば使えるようにしたいです。ヘッダーフッターの追加には表示したいレイアウトをInflateしたものを引数にadd○○関数を使用します。ヘッダーフッターにもリスナーを付けたいのでHolderはAnyでonBindItemViewHolderを渡します。
作ったまではいいのですが、ヘッダーフッターがうまく表示されません。一応表示はされるのですがレイアウトの一部しか表示されなかったり、空白のスペースだけ表示されてしまったりと、想定した動作になりません。どのようにすればうまく表示されるでしょうか。
知恵袋とのマルチポストになります
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13220832973
[MainActivity.kt]
Kotlin
1val headerView = View.inflate(requireContext(), R.layout.view_header, null) 2val separateNavigationView = View.inflate(requireContext(), R.layout.view_separate_navigation, null) 3recyclerAdapter?.addHeaderView(headerView) 4recyclerAdapter?.addBetweenView(separateNavigationView, 5) 5...
[RecyclerAdapter(継承先のAdapter)]
Kotlin
1class MusicRecyclerHolder(itemView: View): RecyclerView.ViewHolder(itemView){ 2 val artwork = itemView.findViewById<ImageButton>(R.id.VSL_ArtImage) 3 val musicTitle = itemView.findViewById<TextView>(R.id.VSL_Title) 4 val musicText =itemView.findViewById<TextView>(R.id.VSL_TitleSec) 5 val menuIcon = itemView.findViewById<ImageButton>(R.id.VSL_Menu) 6 7 interface ListListener{ 8 fun onItemClick(tappedView: View?, viewHolder: MusicRecyclerHolder?, musicData: MusicData?) 9 } 10} 11 12class MusicRecyclerAdapter( 13 private val context: Context, 14 private val dataList: List<MusicData>, 15 private val isShowArtist: Boolean, 16 private val listener: MusicRecyclerHolder.ListListener 17): HFRecyclerAdapter<MusicRecyclerHolder>() { 18 19 override fun onCreateItemViewHolder(parent: ViewGroup, viewType: Int): MusicRecyclerHolder { 20 return MusicRecyclerHolder(LayoutInflater.from(parent.context).inflate(R.layout.view_song_list, parent, false)) 21 } 22 23 override fun onBindItemViewHolder(viewHolder: Any, position: Int, isHF: Boolean) { 24 if (!isHF && viewHolder is MusicRecyclerHolder) { 25 val data = dataList[position] 26 with(viewHolder) { 27 //リスナー付けたり色々処理 28 } 29 } else if(viewHolder is RecyclerView.ViewHolder){ 30 viewHolder.itemView.setOnClickListener { 31 listener.onItemClick(null, null, null) //ヘッダーフッター 32 } 33 } 34 } 35 36 override fun getNormalItemCount(): Int = dataList.size 37}
[HFRecyclerAdapter(今回問題の継承元Adapter)]
Kotlin
1abstract class HFRecyclerAdapter<ViewHolder: RecyclerView.ViewHolder>: RecyclerView.Adapter<RecyclerView.ViewHolder>(){ 2 3private var currentHV: View? = null 4private val headerViewList = mutableListOf<View>() 5private val hooterViewList = mutableListOf<View>() 6private val betweenViewMap = mutableMapOf<Int, View>() 7 8abstract fun onCreateItemViewHolder(parent: ViewGroup, viewType: Int): ViewHolder 9 10abstract fun onBindItemViewHolder(viewHolder: Any, position: Int, isHF: Boolean = false) 11 12abstract fun getNormalItemCount(): Int 13 14internal class HeaderFooterHolder(itemView: View?) : ViewHolder(itemView!!) 15 16override fun getItemViewType(position: Int): Int { 17if(headerViewList.isNotEmpty() && position < headerViewList.size) { 18currentHV = headerViewList[position] 19return ITEM_VIEW_TYPE_HEADER 20} 21 22if(betweenViewMap[position - headerViewList.size] != null){ 23currentHV = betweenViewMap[position - headerViewList.size]!! 24return ITEM_VIEW_TYPE_BETWEEN 25} 26 27if(position - headerViewList.size < getNormalItemCount()){ 28return ITEM_VIEW_TYPE_NORMAL 29} 30 31currentHV = hooterViewList[position - (getNormalItemCount() + headerViewList.size)] 32return ITEM_VIEW_TYPE_HOOTER 33} 34 35override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 36return when(viewType){ 37ITEM_VIEW_TYPE_HEADER, ITEM_VIEW_TYPE_HOOTER, ITEM_VIEW_TYPE_BETWEEN -> { 38if(currentHV != null) { 39HeaderFooterHolder(currentHV) 40} 41else { 42onCreateItemViewHolder(parent, viewType) 43} 44} 45else -> onCreateItemViewHolder(parent, viewType) 46} 47} 48 49override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 50val i = position - headerViewList.size 51onBindItemViewHolder(holder, i, (getItemViewType(position) != ITEM_VIEW_TYPE_NORMAL)) 52} 53 54override fun getItemCount(): Int = getNormalItemCount() + headerViewList.size + hooterViewList.size + betweenViewMap.size 55 56fun addHeaderView(layoutView: View){ 57headerViewList.add(layoutView) 58} 59 60fun addHooterView(layoutView: View){ 61hooterViewList.add(layoutView) 62} 63 64fun addBetweenView(layoutView: View, position: Int){ 65betweenViewMap.put(position, layoutView) 66} 67 68fun isHeader(position: Int) = (getItemViewType(position) == ITEM_VIEW_TYPE_HEADER) 69 70fun isHooter(position: Int) = (getItemViewType(position) == ITEM_VIEW_TYPE_HOOTER) 71 72fun isBetween(position: Int) = (getItemViewType(position) == ITEM_VIEW_TYPE_BETWEEN) 73 74companion object{ 75const val ITEM_VIEW_TYPE_HEADER = 872 76const val ITEM_VIEW_TYPE_HOOTER = 873 77const val ITEM_VIEW_TYPE_BETWEEN = 874 78const val ITEM_VIEW_TYPE_NORMAL = 875 79} 80}
回答1件
あなたの回答
tips
プレビュー