前提・実現したいこと
androidで、RecyclerViewを使用したリスト表示のプログラムを作っています。
発生している問題・エラーメッセージ
リストの一部行を、ランダム表示にしたいのですが、スクロールすると、ランダム
表示の場所が何度も更新ががかかってしまいます。
具体的には、スクロールしたさいに、getItemViewTypeが呼ばれるまではいいのですが、
同じpositionのものを大量(55回連続)で呼んでいます。
log
1getItemViewType: position:8, type : 1 2getItemViewType: position:8, type : 5 3getItemViewType: position:8, type : 1 4getItemViewType: position:8, type : 4 5・ 6・ 7・ 8getItemViewType: position:8, type : 1
getItemViewTypeを同じpositionのものをするロール毎に1回だけ呼ぶように
できないでしょうか?
該当のソースコード
kotlin
1class dataAdapter(private val fragment: Fragment) 2 : RecyclerView.Adapter<RecyclerView.ViewHolder>() { 3 init { 4 } 5 6 override fun getItemViewType(position: Int): Int { 7 val type:Int = if(8 != position%9 ){ 8 -1 9 }else { 10 Random(SystemClock.currentThreadTimeMillis()).nextInt(4) 11 } 12 return type 13 } 14 15 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 16 Util.log.d("onCreateViewHolder") 17 val itemView: View 18 val viewHolder: RecyclerView.ViewHolder 19 20 // レイアウト設定 21 when (viewType) { 22 0 -> { 23 itemView = LayoutInflater.from(parent.context).inflate( 24 R.layout.item_0, parent, false) 25 viewHolder = ZeroViewHolder(fragment, itemView) 26 } 27 1 -> { 28 itemView = LayoutInflater.from(parent.context).inflate( 29 R.layout.item_1, parent, false) 30 viewHolder = OneViewHolder(fragment, itemView) 31 } 32 2 -> { 33 itemView = LayoutInflater.from(parent.context).inflate( 34 R.layout.item_2, parent, false) 35 viewHolder = TwoViewHolder(fragment, itemView) 36 } 37 3 -> { 38 itemView = LayoutInflater.from(parent.context).inflate( 39 R.layout.item_3, parent, false) 40 viewHolder = ThreeViewHolder(fragment, itemView) 41 } 42 4 -> { 43 itemView = LayoutInflater.from(parent.context).inflate( 44 R.layout.4, parent, false) 45 viewHolder = fourViewHolder(fragment, itemView) 46 }fragment 47 else -> { 48 itemView = LayoutInflater.from(parent.context).inflate( 49 R.layout.item_other, parent, false) 50 viewHolder = OtherViewHolder(fragment, itemView) 51 } 52 } 53 return viewHolder 54 } 55 56 override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) { 57 (viewHolder as ViewHolderInterface).onBindViewHolder(position) 58 } 59 60 override fun getItemCount(): Int { 61 return this.rssList.size 62 } 63} 64
補足情報(FW/ツールのバージョンなど)
android 8.0
kotlin 1.3.50
android studio