땀이 삐질삐질 나는 개발 일기

안드로이드 리사이클러뷰 속에서 체크박스 처리 하기 본문

개발 Tip

안드로이드 리사이클러뷰 속에서 체크박스 처리 하기

삐질 2020. 2. 5. 21:14

 

안녕하세요 개발자 삐질입니다.
 
오늘은 리사이클러뷰를 사용할 때 , 체크박스 처리를 어떻게 할 것인지 예제를 통해 알아보고자 합니다.
백마디의 설명보다, 잘 달린 주석이 낫다 판단하여 설명보다는 주석과 스크린샷 위주로 대체하겠습니다.
 
  • 저의 대부분의 블로그 자료는  FindViewById를 없애기 위해 DataBinding을 사용합니다. ( Gradle:App ) 옵션 참고
 
MainActivity.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
 
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
 
<Button
android:id="@+id/btn_select_all"
android:layout_width="0dp"
android:layout_height="50dp"
android:text="전체선택"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintVertical_bias="0"
app:layout_constraintTop_toTopOf="parent"></Button>
 
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintVertical_bias="0"
app:layout_constraintTop_toBottomOf="@id/btn_select_all"></androidx.recyclerview.widget.RecyclerView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
 
 
Item_View.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp">
 
 
<CheckBox
android:id="@+id/check_box"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="15dp"
android:checked="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5"></CheckBox>
 
 
<TextView
android:id="@+id/text_title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
android:minWidth="100dp"
android:text="타이틀"
android:gravity="center|left"
app:layout_constraintStart_toEndOf="@id/check_box"
app:layout_constraintTop_toTopOf="@+id/check_box"
app:layout_constraintVertical_bias="0.5">
 
</TextView>
 
<TextView
android:id="@+id/text_contents"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="10dp"
android:text="컨텐츠"
android:gravity="center|left"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintVertical_bias="0.5"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/text_title"
app:layout_constraintTop_toTopOf="parent">
 
</TextView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
 
 
 
MainActivity.kt
 
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.recyclercheckitem.databinding.ActivityMainBinding
 
class MainActivity : AppCompatActivity(), View.OnClickListener {
 
lateinit var binding: ActivityMainBinding
lateinit var adapter: ItemAdapter
var model = ItemModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
init()
}
 
fun init(){
binding.btnSelectAll.setOnClickListener(this)
model.makeTestItems()
adapter = ItemAdapter()
adapter.items = model
 
var linearLayoutManager =LinearLayoutManager(this)
linearLayoutManager.orientation=RecyclerView.VERTICAL
binding.recyclerview.layoutManager=linearLayoutManager
binding.recyclerview.adapter=adapter
 
}
 
override fun onResume() {
super.onResume()
}
 
override fun onClick(v: View?) {
model.toggleAllItemClick()
adapter.notifyDataSetChanged()
}
 
}
 
 
ItemAdapter.kt
 
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import android.widget.RadioGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.recyclercheckitem.databinding.ItemViewBinding
 
// 이해를 돕기위해 불피요 한 추상화는 쓰지 않습니다.
class ItemAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var items: ItemModel? = ItemModel()
 
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
var binding = ItemViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ItemHolder(binding)
}
 
override fun getItemCount(): Int {
items?.items?.let {
return it.size
}
return 0
}
 
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is ItemHolder) {
holder.bind(items?.items?.get(position))
}
}
 
 
companion object {
class ItemHolder(var binding: ItemViewBinding) : RecyclerView.ViewHolder(binding.root),
CompoundButton.OnCheckedChangeListener {
var item: ItemModel.ItemEntity? = null
 
init {
binding.checkBox.setOnCheckedChangeListener(this)
}
 
fun bind(item: ItemModel.ItemEntity?) {
item?.let {
this.item = item
binding.checkBox.isChecked = it.isChecked
binding.textTitle.text = it.title
binding.textContents.text = it.contents
}
}
 
 
override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) { //체크 리스너 등록
item?.let {
it.isChecked = it.isChecked.not()
Log.d("checkState", "${it.isChecked}")
}
}
}
}
}
 
 
ItemModel.kt
 
class ItemModel {
 
var items: ArrayList<ItemEntity?> = ArrayList()
var selectAllState:Boolean=false
 
fun toggleAllItemClick() { //전체 선택 메서드
//이해를 돕기 위해 메인 루프에서 진행하지만 베스트는 -> 스래드 처리
for(item in items){
item?.let {
it.isChecked=selectAllState.not() //상태값 반전
}
}
selectAllState= selectAllState.not() //모델의 상태값 반전
}
 
fun toggleEachItemClick(pos: Int) { // 개개인의 선택 메서드
items[pos]?.let {
it.isChecked = it.isChecked.not() //상태값 반전
}
}
 
fun makeTestItems(){ //테스트 아이템 만들기 메서드
items.clear()
for(i in 0 until 100){
var item =ItemEntity()
item.title= "$i 번째 아이템 "
item.contents="내용부"
items.add(item)
}
}
 
 
inner class ItemEntity {
var isChecked: Boolean = false
var title: String? = null
var contents: String? = null
}
}
 
 
 
초급 안드로이드 개발자를 위한 카카오톡 오픈 채팅방을 운영 중 입니다. 
 
 
 
 
 
 

 

Comments