상세 컨텐츠

본문 제목

[안드로이드 코틀린] SQLite ToDo List 만드는 방법 part3 - 메인 화면과 메인 코드

안드로이드

by aries574 2022. 9. 16. 14:41

본문


이번 시간에는 ToDo List 만들기 세 번째 시간 메인 화면메인 코드를 만들어 보겠습니다.

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

2022.09.15 - [안드로이드] - [안드로이드 코틀린] SQLite ToDo List 만드는 방법 part2 - 할 일 화면과 어댑터 클래스

 

[안드로이드 코틀린] SQLite ToDo List 만드는 방법 part2 - 할 일 화면과 어댑터 클래스

이번 시간에는 ToDo List 만들기 두 번째 시간 할 일 화면과 어댑터 클래스를 만들어 보겠습니다. 목차 1. 할 일 화면 task_item.xml 2. 어댑터 클래스 ToDoAdapter.kt 1. 할 일 화면 task_item.xml..

aries574.tistory.com


목차

1. 실행 화면
2. 메인 화면 activity_main.xml
3. 메인 코드 MainActivity.kt


1. 실행 화면

 


2. 메인 화면 activity_main.xml

 

- 설명 -

 1. 입력하는 레이아웃 LinearLayout

 2. 리스트 레이아웃 LinearLayout

 3. 등록 및 수정하는 FloatingActionButton

 4. 입력 모드일 땐 FloatingActionButton 숨기기

 5. 리스트 모드일 땐 입력 레이아웃 숨기기

 6. 아이콘 res -> drawable

ic_add.xml
0.00MB
ic_delete.xml
0.00MB
ic_edit.xml
0.00MB

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- 입력창-->
    <LinearLayout
        android:id="@+id/bottom_section"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:padding="10dp"
        android:visibility="gone">

        <EditText
            android:id="@+id/todo_text"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:layout_weight="1" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/add_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:enabled="false"
            android:text="ADD" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/bottom_section"
        android:background="#eee">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="20dp"
        android:backgroundTint="@android:color/holo_green_dark"
        app:srcCompat="@drawable/ic_add"
        app:tint="@android:color/white" />


</RelativeLayout>

 


3. 메인 코드 MainActivity.kt

- 설명 -

 1. selectData() 조회

   1-1 taskList = db.getAllTasks()

      DB조회리스트에 담기

   1-2 Collections.reverse(taskList)

      최신순으로 정렬

   1-3 adapter.setTasks(taskList)

      어댑터에 담기

   1-4 adapter.notifyDataSetChanged()

      적용

 2. selectReset(type: String)

   2-1 todoText.setText("")

      입력 텍스트 초기화

   2-2 if(!type.equals("ADD"))

      수정 모드일 때 다시 등록으로 초기화

 3. viewMode(type: String)

   Type에 따라 입력창을 보여줄지 버튼을 보여줄지 설정

 4. hideKeyboard(editText: EditText)

   키보드 자동 숨김

 5. ItemTouchHelper

   스와이프 기능(왼쪽: 삭제, 오른쪽: 수정)

class MainActivity : AppCompatActivity() {

    lateinit var taskList: ArrayList<ToDoModel>
    lateinit var adapter: ToDoAdapter
    lateinit var recyclerView: RecyclerView
    lateinit var fab: FloatingActionButton
    lateinit var todoText: EditText
    lateinit var addBtn: Button

    lateinit var db: ToDoDB

    lateinit var bottomLayout: LinearLayout

    var gId: Int = 0

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

        //DB
        db = ToDoDB(this)

        //초기화
        taskList = ArrayList()
        bottomLayout = findViewById(R.id.bottom_section)
        todoText = findViewById(R.id.todo_text)
        addBtn = findViewById(R.id.add_btn)
        fab = findViewById(R.id.fab)

        //recyclerView 설정
        recyclerView = findViewById(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(this)

        //adapter 설정
        adapter = ToDoAdapter(db)
        adapter.setTask(taskList)

        //adapter 적용
        recyclerView.adapter = adapter

        //조회
        selectData()

        //등록모드
        fab.setOnClickListener {
            viewMode("ADD")
        }

        //추가 버튼
        addBtn.setOnClickListener {

            viewMode("FAB")

            //입력값
            var text = todoText.text.toString()

            //ADD면 등록 아니면 수정
            if(addBtn.text.toString() == "ADD"){ //등록

                //데이터 담기
                val task = ToDoModel(0, text, 0)

                //할 일 추가
                db.addTask(task)

                //조회 및 리셋
                selectReset("ADD")

            }else{ //수정
                //할 일 수정
                db.updateTask(gId, text)

                //조회 및 리셋
                selectReset("UPDATE")
            }
            //키보드 내리기
            hideKeyboard(todoText)
        }

        //할 일 입력 체크
        todoText.addTextChangedListener(object: TextWatcher{
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}

            override fun onTextChanged(charSeq: CharSequence?, p1: Int, p2: Int, p3: Int) {
               //텍스트 변경 시 실행

                //입력값이 없으면
                if(charSeq.toString() == ""){
                    //비활성화
                    addBtn.isEnabled = false

                    //글씨색 회색으로 변경
                    addBtn.setTextColor(Color.GRAY)
                }else{
                    //활성화
                    addBtn.isEnabled = true

                    //글씨색 검정으로 변경
                    addBtn.setTextColor(Color.BLACK)
                }
            }

            override fun afterTextChanged(p0: Editable?) {}
        })

        //스와이프( 수정, 삭제 기능)
        ItemTouchHelper(object: ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT){
            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
               return false
            }

            //스와이프 기능
            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {

                val position = viewHolder.absoluteAdapterPosition

                when(direction){
                    ItemTouchHelper.LEFT -> { //삭제

                        //할 일 변수에 담기
                        val id = taskList[position].id

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

                        //DB에서 삭제
                        db.deleteTask(id)
                    }
                    ItemTouchHelper.RIGHT -> { //수정

                        viewMode("UPDATE")
                        //할 일 가져오기
                        val task = taskList[position].task

                        //할 일 ID 전역변수에 담기
                        gId = taskList[position].id

                        //입력창에 수정할 할 일 넣기
                        todoText.setText(task)

                        //버튼 문구 변경
                        addBtn.text = "UPDATE"
                    }
                }
            }

            //그리기
            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)//왼쪽 스와이프 라벨 색상
                    .addSwipeRightBackgroundColor(Color.BLUE)//오른쪽 스와이프 배경색 설정
                    .addSwipeRightActionIcon(R.drawable.ic_edit)//오른쪽 스와이프 아이콘 설정
                    .addSwipeRightLabel("수정") //오른쪽 스와이프 라벨 설정
                    .setSwipeRightLabelColor(Color.WHITE)//오른쪽 스와이프 라벨 색상
                    .create()
                    .decorate()

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

        }).attachToRecyclerView(recyclerView)

    }//onCreate()

    /**
     * 조회
     */
    private fun selectData(){

        //조회
        taskList = db.getAllTasks()

        //최신순 정렬
        taskList.reverse()

        //데이터 담기
        adapter.setTask(taskList)

        //적용
        adapter.notifyDataSetChanged()
    }

    /**
     * 조회 및 리셋
     */
    private fun selectReset(type: String){

        //조회
        selectData()

        //할일 입력 초기화
        todoText.setText("")

        //등록이 아니면 등록으로 변경
        if(type != "ADD"){
            addBtn.text = "ADD"
        }
    }

    private fun viewMode(type: String){

        // 입력하고 나면 입력창 사라지고 FAB 보여줌
        if(type == "FAB"){
            //입력창 숨김
            bottomLayout.visibility = View.GONE

            //fab 보여줌
            fab.visibility = View.VISIBLE
        }else{
            //입력창 보여줌
            bottomLayout.visibility = View.VISIBLE

            //fab 숨김
            fab.visibility = View.INVISIBLE
        }
    }

    /**
     * 키보드 숨기기
     */
    private fun hideKeyboard(editText: EditText){

        val manager: InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

        //키보드 숨김
        manager.hideSoftInputFromWindow(editText.applicationWindowToken, 0)
    }
}

2022.09.13 - [안드로이드] - [안드로이드 코틀린] 액티비티(Activity) 뒤로 가기 버튼 만드는 방법

 

[안드로이드 코틀린] 액티비티(Activity) 뒤로가기 버튼 만드는 방법

이번 시간에는 액티비티(Activity) 이동 후에 다시 이전 화면으로 돌아가는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 액티비티 만들기 3. 환경 설정 파일 AndroidManifest.xml 4. 메인 화면 acti

aries574.tistory.com

2022.09.08 - [안드로이드] - [안드로이드 코틀린] 달력(DatePicker) 코드에서 호출하는 방법

 

[안드로이드 코틀린] 달력(DatePicker) 코드에서 호출하는 방법

이번 시간에는 달력(DatePicker)을 화면이 아니라 코드에서 호출하는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 activity_main.xml 3. 메인 코드 MainActivity.kt 1. 실행 화면 2. 메인..

aries574.tistory.com

2022.09.07 - [안드로이드] - [안드로이드 코틀린] 뒤로 가기 두 번 눌러 종료하는 방법

 

[안드로이드 코틀린] 뒤로 가기 두 번 눌러 종료하는 방법

이번 시간에는 뒤로 가기 버튼 두 번 눌러 앱 종료하는 방법을 알아보겠습니다. 한 번 누르면 한 번 더 누르라는 알림이 뜨고, 3초 안에 다시 눌러야 종료되는 방법입니다. 목차 1. 실행 화면 2. 

aries574.tistory.com

 

 

반응형

관련글 더보기

댓글 영역