일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- retrofit
- 제플린
- 안드로이드 메모리릭
- 구글맵안돼요
- 안드로이드 익명클래스
- #ContentProvider #App DataShare
- 리사이클러뷰 체크박스
- retrofi
- #SMS API #안드로이드 SMS #SMS Retriever
- MVVM
- retrofit2
- #리사이클러뷰 어댑터
- zeplin
- #android #안드로이드 #glide #gif #이미지다운로드
- 클린아키텍쳐
- #안드로이드
- 안드로이드 아키텍쳐
- 빗버킷 #bitbucket #authorization failed #깃
- 사용법
- 키스토어
- #리사이클러뷰
- 안드로이드해상도
- 레트로핏
- 메모리릭
- 안드로이드
- #안드로이드 개발자 #안드로이드 신입 #개발자 이직 #안드로이드 면접 #신입 개발자
Archives
- Today
- Total
땀이 삐질삐질 나는 개발 일기
안드로이드 리사이클러뷰 속에서 체크박스 처리 하기 본문
안녕하세요 개발자 삐질입니다.
오늘은 리사이클러뷰를 사용할 때 , 체크박스 처리를 어떻게 할 것인지 예제를 통해 알아보고자 합니다.
백마디의 설명보다, 잘 달린 주석이 낫다 판단하여 설명보다는 주석과 스크린샷 위주로 대체하겠습니다.
-
저의 대부분의 블로그 자료는 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
}
}
초급 안드로이드 개발자를 위한 카카오톡 오픈 채팅방을 운영 중 입니다.
'개발 Tip' 카테고리의 다른 글
[안드로이드] 키스토어 각종 해시값 쉽게 보는 방법 (0) | 2020.02.12 |
---|---|
[안드로이드] Debug, Release, Google Signing ...Keystore? 뭐하는 녀석이지? (0) | 2020.02.12 |
BaseActivity 만들기 with DataBinding,ViewModel (Kotlin) (0) | 2020.01.06 |
다중 프로젝트가 의존하는 Module Path를 각 개발 환경에서 자동화 하기 (0) | 2019.11.07 |
Glide 4.x 버전 이상에서 Gif 및 이미지 다운받아 파일로 저장 (2) | 2019.10.22 |
Comments