RecycleViewでの選択表示ができたのでメモ
環境
AndroidStudio:2021.1.1 Patch2
TargetSDK:31
やりたいこと
・リストを1つ選択状態で表示し,クリックした部分を選択にし,ほか選択部分は解除
参考にしたサイトで継承などしてましたが,継承するとクリックイベントが取れなくなったりしたのでとりあえずadapterに直書き
あと画面外に流れた際におかしくなっていましたが,画面外のリストをアタッチするタイミングでも判定すれば問題なく動作しました。
Adapter.kt
class KindAdapter(private val kindList: ArrayList<KindListData>, var defaultCode: String = "") :
RecyclerView.Adapter<KindAdapter.ViewHolder>() {
// 表示中のリスト
private var attachedItems = mutableSetOf<RecyclerView.ViewHolder>()
// 選択アイテムのID(ポジション)
private var checkedItemId: Int = 0
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
// 表示するコードと名前をセット
val code: TextView = view.findViewById(R.id.kindCode)
val name: TextView = view.findViewById(R.id.kindName)
// 選択表示する用のTextView
val row: CheckedTextView = view.findViewById(R.id.kindRow)
}
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.layout_kind_list_item, viewGroup, false)
// デフォルト表示
repeat(kindList.size) {
if (kindList[it].code == defaultCode) {
checkedItemId = it
}
}
return ViewHolder(view)
}
override fun onBindViewHolder(viewholder: ViewHolder, position: Int) {
val kind = kindList[position]
Timber.i("onBindViewHolder-position:${position}:${viewholder}")
viewholder.code.text = kind.code
viewholder.name.text = kind.name
viewholder.itemView.setOnClickListener {
choiceSingleItem(viewholder, position)
listener.onItemClick(kind)
}
}
override fun getItemCount() = kindList.size
private fun choiceSingleItem(viewHolder: ViewHolder, position: Int) {
checkedItemId = position
Timber.i("choiceSingleItem:${checkedItemId}| position:${position}")
// クリック時に表示されているリスト項目を処理
attachedItems.forEach {
//クリックしたポジションと同じが判定(画面の背景色はdrawbleで実施)
(it as ViewHolder).row.isChecked = it.absoluteAdapterPosition == checkedItemId
notifyItemChanged(position)
}
}
// 画面外のリストが表示されるとき
override fun onViewAttachedToWindow(holder: ViewHolder) {
Timber.i("onViewAttachedToWindow:${holder.absoluteAdapterPosition}| checked=${checkedItemId}")
attachedItems.add(holder)
// 画面表示外のリストを処理
holder.row.isChecked = holder.absoluteAdapterPosition == checkedItemId
}
// 画面のリストが画面外で破棄?されるとき
override fun onViewDetachedFromWindow(holder: ViewHolder) {
Timber.i("onViewDetachedFromWindow:${holder}| checked=${checkedItemId}")
attachedItems.remove(holder)
}
}
参考:
https://android.suzu-sd.com/2021/04/recyclerview_choice_mode/
https://qiita.com/CAIOS/items/d7675a12b1345bf180d1
0 件のコメント:
コメントを投稿