상세 컨텐츠

본문 제목

[안드로이드 코틀린] Database Room 사용법 part5 - 삭제

안드로이드

by aries574 2022. 6. 28. 14:13

본문


이번 시간에는 리스트에 있는 사용자를

왼쪽으로 스와이프(Swipe) 해서 삭제를

하는 방법에 대하여 알아보겠습니다.

이전 포스팅은 아래 링크를 들어가시면 됩니다.


목차

1. 실행 화면
2. 라이브러리 등록
3. 아이템 어댑터 수정 UserAdapter.kt
4. 메인 코드 수정 MainActivity.kt


1. 실행 화면


2. 라이브러리 등록

build.gradle(Module:프로젝트명:app)

dependencies 괄호 안에 아래 코드를 넣어주시면 됩니다.

implementation 'it.xabaras.android:recyclerview-swipedecorator:1.4'

 

setting.gradle

repositories 괄호 안에 아래 코드를 넣어주시면 됩니다.

maven { url 'https://jitpack.io' }

 


3. 아이템 어댑터 수정 UserAdapter.kt

 - 설명 - 

1. userList 타입 List -> ArrayList 변경

2. 사용자 삭제하는 deleteUser 함수 추가

class UserAdapter(private val context: Context): RecyclerView.Adapter<UserAdapter.MyViewHolder>() {

    private var userList: ArrayList<User> = ArrayList<User>()

    class MyViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){

        val nameText: TextView = itemView.findViewById(R.id.name_text)
        val ageText: TextView = itemView.findViewById(R.id.age_text)
    }

    //화면 설정
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view: View = LayoutInflater.from(parent.context)
            .inflate(R.layout.list_item, parent, false)

        return MyViewHolder(view)
    }

    //데이터 설정
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {

        //데이터 변수에 담기
        var uId =  userList[holder.bindingAdapterPosition].id
        var name = userList[holder.bindingAdapterPosition].userName
        var age = userList[holder.bindingAdapterPosition].userAge

        //화면에 데이터 적용
        holder.nameText.text = name
        holder.ageText.text = age

        //수정 화면으로 이동
        holder.itemView.setOnClickListener {
            var intent: Intent = Intent(context, UpdateActivity::class.java)
            intent.putExtra("uId", uId)
            intent.putExtra("uName", name)
            intent.putExtra("uAge", age)
            context.startActivity(intent)
        }
    }

    //아이템 갯수
    override fun getItemCount(): Int {
        return userList.size
    }

    //사용자 등록
    fun setUserList(userList: ArrayList<User>){
        this.userList = userList
        notifyDataSetChanged()
    }

    //사용자 삭제
    fun deleteUser(position: Int){
        this.userList.removeAt(position)
    }
}

 

4. 메인 코드 수정 MainActivity.kt

 - 설명 -

1. userList  전역 변수로 변경

2. userList 타입 ArrayList 변경

3.  onSwiped 제스처 기능 구현

4. onChildDraw 제스처 그림 구현

5. RecyclerViewSwipeDecorator.Builder

 스와이프 꾸미기

6. attachToRecyclerView(recyclerView)

적용할 recyclerView 변수 넘기기

class MainActivity : AppCompatActivity() {

    private lateinit var adapter: UserAdapter

    private var userList: ArrayList<User> = ArrayList()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val insertBtn: FloatingActionButton = findViewById(R.id.insert_btn)
        insertBtn.setOnClickListener {
            val intent: Intent = Intent(this, InsertActivity::class.java)

            activityResult.launch(intent)
        }

        //RecyclerView 설정
        val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)

        //UserAdapetr 초기화
        adapter = UserAdapter(this)

        //Adapter 적용
        recyclerView.adapter = adapter

        //사용자 조회
        loadUserList()

        ItemTouchHelper(object: ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT){

            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
                return false
            }

            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {

                var position: Int = viewHolder.bindingAdapterPosition

                when(direction){

                    ItemTouchHelper.LEFT ->{

                        var uId: Int? = userList.get(position).id
                        var uName: String? = userList.get(position).userName
                        var uAge: String? = userList.get(position).userAge

                        var user: User = User(uId, uName, uAge)

                        //아이템 삭제
                        adapter.deleteUser(position)

                        //아이템 삭제 화면 재정리
                        adapter.notifyItemRemoved(position)

                        //DB생성
                        var db: AppDatabase? = AppDatabase.getDatabase(applicationContext)

                        //삭제 쿼리
                        db?.userDao()?.deleteUser(user)
                    }
                }
            }

            override fun onChildDraw(
                c: Canvas,
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                dX: Float,
                dY: Float,
                actionState: Int,
                isCurrentlyActive: Boolean
            ) {
                //스와이프 기능
                RecyclerViewSwipeDecorator.Builder(c, recyclerView, viewHolder,
                dX, dY, actionState, isCurrentlyActive)
                    .addSwipeLeftBackgroundColor(Color.RED)
                    .addSwipeLeftActionIcon(R.drawable.ic_delete)
                    .addSwipeLeftLabel("삭제")
                    .setSwipeLeftLabelColor(Color.WHITE)
                    .create()
                    .decorate()

                super.onChildDraw(
                    c,
                    recyclerView,
                    viewHolder,
                    dX,
                    dY,
                    actionState,
                    isCurrentlyActive
                )
            }

        }).attachToRecyclerView(recyclerView) //recyclerView에 스와이프 적용
    }

    private val activityResult: ActivityResultLauncher<Intent> = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()){
        if(it.resultCode == RESULT_OK){
            //돌아온 값이 OK라면

            //사용자 조회
            loadUserList()
        }
    }

    //액티비티 백그라운드에 있는데 호출되면 실행
    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)

        //사용자 조회
        loadUserList()
    }

    //사용자 조회
    private fun loadUserList(){

        val db: AppDatabase? = AppDatabase.getDatabase(applicationContext)

        userList = db?.userDao()!!.getAllUser() as ArrayList<User>

        if(userList.isNotEmpty()){

            //데이터 적용
            adapter.setUserList(userList)
        }
    }
}

2022.06.17 - [안드로이드] - [안드로이드 코틀린] 정해진 시간에 알람 울리는 방법 Notification TimePickerDialog part1 - 설정

 

[안드로이드 코틀린] 정해진 시간에 알람 울리는 방법 Notification TimePickerDialog part1 - 설정

사용자가 정한 시간에 알람이 울리게 하는 방법에 대하여 알아보겠습니다. 이번 시간에는 알람 관련 클래스와 설정들을 만들어 보겠습니다. 목차 1. 알람 클래스 만들기 NotificationHelper.kt 2. 

aries574.tistory.com

2022.06.06 - [안드로이드] - [안드로이드 코틀린] 커스텀 달력 만드는 방법 part1 화면 구성

 

[안드로이드 코틀린] 커스텀 달력 만드는 방법 part1 화면 구성

이번 시간부터 코틀린 버전 커스텀 달력을 만들어보겠습니다. 이번 포스팅은 화면 구성입니다. 목차 1. 실행 화면 2. dataBinding 설정 3. 메인 화면 구성 activity_main.xml 1. 실행 화면 2. dataB..

aries574.tistory.com

2022.06.14 - [안드로이드] - [안드로이드 코틀린] Tab Custom Animation part1 - 화면 구성 및 설정

 

[안드로이드 코틀린] Tab Custom Animation part1 - 화면 구성 및 설정

앞으로 TabLayout을 직접 만들어 애니메이션 기능까지 넣어보도록 하겠습니다. 이번 시간에는 화면 구성 및 설정을 만들어 보겠습니다. 목차 1. 실행 화면 2. dataBinding 설정 build.gradle 3. 테마 변경 t

aries574.tistory.com

 

 

반응형

관련글 더보기

댓글 영역