타닥타닥 개발자의 일상

Kotlin 코틀린 RecycleView, DatePicker, Singleton, SQLlite 사용해서 안드로이드 가계부 만들기 본문

코딩 기록/Kotlin

Kotlin 코틀린 RecycleView, DatePicker, Singleton, SQLlite 사용해서 안드로이드 가계부 만들기

NomadHaven 2022. 2. 15. 18:08

위와 같은 형태의 가계부를 만들 예정

 


 

폴더 및 파일 구성

 

CustomAdapter : RecyclerView와 arrayList를 이어주는 역할

DBHelper : SQLite을 통한 데이터 입력, 수정, 검색 등을 시행하는 함수가 내재된 공간

HouseKeepingDate : Dto

InsertActivity : SQLite의 입력 기능을 실행하는 페이지

MainActivity: 메인화면, 메뉴를 보여주는 페이지

SearchActivity: 특정한 일자의 검색을 SQLite로 실행하는 페이지

 

Insert,SearchActivity는 example 폴더 우클릭 > 새로 만들기 > Activity > Empty Activity 로 생성해야한다.

 

 


HouseKeepingDate.kt

 

package com.example.housekeepingbook

class HouseKeepingData (var seq:Int, var category:String, var purpose:String, var date:String, var money:Int, var memo:String)

 

 


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

    <TextView
            android:id="@+id/menuTxt"
            android:layout_width="126dp"
            android:layout_height="38dp"
            android:text="메뉴"
            android:textSize="30sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.098"
            app:layout_constraintHorizontal_bias="0.567"/>
    <Button
            android:id="@+id/searchBtn"
            android:text="검색"
            android:layout_width="99dp"
            android:layout_height="101dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintVertical_bias="0.427"/>
    <Button
            android:id="@+id/timeSearchBtn"
            android:text="기간검색"
            android:layout_width="99dp"
            android:layout_height="101dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.926"
            app:layout_constraintVertical_bias="0.427"/>
    <Button
            android:id="@+id/insertBtn"
            android:text="추가"
            android:layout_width="99dp"
            android:layout_height="101dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.105"
            app:layout_constraintVertical_bias="0.427"/>

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt
package com.example.housekeepingbook

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

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


        val insertBtn = findViewById<Button>(R.id.insertBtn)
        val searchBtn = findViewById<Button>(R.id.searchBtn)
        val timeSearchBtn = findViewById<Button>(R.id.timeSearchBtn)


        insertBtn.setOnClickListener {
            val intent = Intent(this, InsertActivity::class.java)
            startActivity(intent)
        }

        searchBtn.setOnClickListener {
            val intent = Intent(this, SearchActivity::class.java)
            startActivity(intent)
        }

        timeSearchBtn.setOnClickListener {
            val intent = Intent(this, FindTimeActivity::class.java)
            startActivity(intent)

        }


    }

}

 

 


DBHelper.kt
package com.example.housekeepingbook

import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper


class DBHelper(context: Context, filename:String): SQLiteOpenHelper(context,filename,null,1) {

    companion object {
        var dbhelper: DBHelper? = null
        fun getInstance(context: Context, filename: String): DBHelper {
            if (dbhelper == null) {
                dbhelper = DBHelper(context, filename)
            }
            return dbhelper!!
        }
    }

    override fun onCreate(db: SQLiteDatabase?) {
        var sql: String = "CREATE TABLE IF NOT EXISTS HKBook( " +
                "SEQ INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "CATEGORY STRING, " +
                "PURPOSE STRING," +
                "DATE STRING, " +
                "MONEY INTEGER," +
                "MEMO STRING ) "

        db?.execSQL(sql)
    }

    override fun onUpgrade(db: SQLiteDatabase?, p1: Int, p2: Int) {

    }


    fun insert(vo: HouseKeepingData) {

        println("데이터 입력 완료")

        var sql = " INSERT INTO HKBook(CATEGORY,PURPOSE,DATE,MONEY,MEMO) " +
                " VALUES('${vo.category}','${vo.purpose}','${vo.date}',${vo.money},'${vo.memo}')"

        var db = this.writableDatabase
        db.execSQL(sql)


    }

    fun search(date:String):String {
        var sql = " SELECT SEQ, CATEGORY, PURPOSE, MONEY, MEMO  FROM HKBook WHERE DATE =" +
                " '${date}' "

        var db = this.writableDatabase
        var result = db.rawQuery(sql, null)

        var str: String? = ""

        while (result.moveToNext()) {
            str +=  " \n " +"----------------------"+" \n " + " \n " +
                    "번호: " + result.getString(result.getColumnIndex("SEQ")) + " \n " +
                    "분류: " + result.getString(result.getColumnIndex("CATEGORY")) + " \n " +
                    "용도: " + result.getString(result.getColumnIndex("PURPOSE")) + " \n " +
                    "금액: " + result.getInt(result.getColumnIndex("MONEY")) + " \n " +
                    "메모: " + result.getString(result.getColumnIndex("MEMO"))+
                    " \n " +"----------------------"+" \n "
        }

        if(str==""){
            str="검색된 데이터가 없습니다."
        }

        return str!!

        print(str)

    }


    fun findTime(fromDate:String, toDate:String): ArrayList<HouseKeepingData> {

        // 2022-02-15
        var sql = " SELECT SEQ, CATEGORY, PURPOSE, DATE, MONEY, MEMO FROM HKBook WHERE DATE BETWEEN " +
                  " '${fromDate}' AND '${toDate}'"

        var db = this.writableDatabase
        var result = db.rawQuery(sql, null)

        var list = ArrayList<HouseKeepingData>()

        while (result.moveToNext()) {
            var seq = result.getInt(result.getColumnIndex("SEQ"))
            var category = result.getString(result.getColumnIndex("CATEGORY"))
            var purpose = result.getString(result.getColumnIndex("PURPOSE"))
            var date = result.getString(result.getColumnIndex("DATE"))
            var money = result.getInt(result.getColumnIndex("MONEY"))
            var memo = result.getString(result.getColumnIndex("MEMO"))

            list.add(HouseKeepingData(seq,category,purpose,date,money,memo))
        }

        for (i in list.indices){
            println(list[i].date + " " + list[i].money)
        }

        return list
    }





}

자료를 입력하는 구간

activity_insert.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".InsertActivity">

    <TextView
            android:text="금액"
            android:layout_width="128dp"
            android:layout_height="30dp" android:id="@+id/moneyTxt"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintVertical_bias="0.57"
            app:layout_constraintHorizontal_bias="0.163"/>
    <TextView
            android:text="메모"
            android:layout_width="128dp"
            android:layout_height="30dp" android:id="@+id/memoTxt"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintVertical_bias="0.754"
            app:layout_constraintHorizontal_bias="0.163"/>
    <TextView
            android:text="추가"
            android:layout_width="132dp"
            android:layout_height="51dp"
            android:textSize="30dp"
            android:id="@+id/addTxt"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintVertical_bias="0.088"
            app:layout_constraintHorizontal_bias="0.582"/>


    <TextView
            android:text="용도"
            android:layout_width="128dp"
            android:layout_height="30dp" android:id="@+id/titleTXt"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintVertical_bias="0.239"
            app:layout_constraintHorizontal_bias="0.163"/>
    <TextView
            android:text="날짜"
            android:layout_width="128dp"
            android:layout_height="30dp" android:id="@+id/dateTxt"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintVertical_bias="0.396"
            app:layout_constraintHorizontal_bias="0.163"/>

    <RadioGroup
            android:id="@+id/radio_group"
            android:layout_width="217dp"
            android:layout_height="59dp"
            android:orientation="horizontal"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintHorizontal_bias="0.201"
            app:layout_constraintVertical_bias="0.157">

        <RadioButton
                android:id="@+id/incomeRadio"
                android:layout_width="60dp"
                android:layout_height="wrap_content"
                android:text="수입"
                android:layout_marginEnd="10dp"
                />

        <RadioButton
                android:id="@+id/expenseRadio"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="지출"
                android:layout_marginEnd="10dp"/>

    </RadioGroup>
    <EditText
            android:layout_width="472dp"
            android:layout_height="65dp"
            android:inputType="textPersonName"
            android:ems="10"
            android:id="@+id/purposeEditTxt"
            android:layout_marginTop="10dp"
            app:layout_constraintTop_toBottomOf="@+id/titleTXt" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintVertical_bias="0.0" app:layout_constraintHorizontal_bias="0.601"/>
    <EditText
            android:layout_width="468dp"
            android:layout_height="82dp"
            android:inputType="textPersonName"
            android:ems="10"
            android:id="@+id/moneyEditTxt"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.583"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.66"/>
    <EditText
            android:layout_width="477dp"
            android:layout_height="51dp"
            android:inputType="textPersonName"
            android:ems="10"
            android:id="@+id/contentEidtTxt"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.626"
            android:layout_marginTop="32dp" app:layout_constraintTop_toBottomOf="@+id/memoTxt"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintVertical_bias="0.0"/>
    <DatePicker
            android:id="@+id/insertDataPicker"
            android:layout_width="443dp"
            android:layout_height="89dp"
            android:datePickerMode="spinner"
            android:calendarViewShown="false"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.101"
            app:layout_constraintTop_toBottomOf="@+id/dateTxt" app:layout_constraintVertical_bias="0.031"/>
    <Button
            android:text="추가"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/InsertAddBtn"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.666"
            app:layout_constraintVertical_bias="0.957"/>
    <Button
            android:text="메뉴"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/InsertMenuBtn"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.909"
            app:layout_constraintVertical_bias="0.957"/>
    <Button
            android:text="날짜 설정"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/button2"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.968" app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintVertical_bias="0.481"/>

</androidx.constraintlayout.widget.ConstraintLayout>

 

InsertActivity.kt
package com.example.housekeepingbook

import android.app.DatePickerDialog
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.MediaStore
import android.widget.*
import androidx.core.view.get
import java.util.*

class InsertActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_insert)


        val InsertAddBtn = findViewById<Button>(R.id.InsertAddBtn)

        val InsertMenuBtn = findViewById<Button>(R.id.InsertMenuBtn)

        val radio_group = findViewById<RadioGroup>(R.id.radio_group)
        var cateResult: String = ""


        val purposeEditTxt = findViewById<EditText>(R.id.purposeEditTxt)
        val insertDataPicker = findViewById<DatePicker>(R.id.insertDataPicker)
        var DateString = ""
        val DateSetBtn = findViewById<Button>(R.id.button2)

        val moneyEditTxt = findViewById<EditText>(R.id.moneyEditTxt)
        val contentEidtTxt = findViewById<EditText>(R.id.contentEidtTxt)




        DateSetBtn.setOnClickListener {

            var idpMonth:String = (insertDataPicker.month + 1).toString()
            var idpDate:String  = (insertDataPicker.dayOfMonth).toString()

            if(insertDataPicker.month + 1<10){
                idpMonth= "0"+"$idpMonth"
                //달이 10보다 작을 경우 달 앞에 0을 붙인다 ex) 3 ->03 or 9 ->09
            }
            if(insertDataPicker.dayOfMonth<10){
                idpDate = "0"+"$idpDate"
            }	//일이 10보다 작을 경우 일 앞에 0을 붙인다. ex) 7 ->07  or 3 ->03

            DateString =
                insertDataPicker.year.toString() + "-" + (idpMonth) + "-" + idpDate
            println("DateString:$DateString")
			//SQLite에서 Date 열의 값을 String으로 지정했고 형식은 YYYY-MM-DD로 맞춰야한다. 
            //따라서 "-"가 년/월 월/일 사이에 추가된다.
            val toast = Toast.makeText(this.applicationContext, DateString, Toast.LENGTH_SHORT)
            toast.show()
        }


        radio_group.setOnCheckedChangeListener { group, chekcedId ->
            when (chekcedId) {
                R.id.incomeRadio -> cateResult = "수입"
                R.id.expenseRadio -> cateResult = "지출"
            }
        }

        InsertAddBtn.setOnClickListener {

            val houseKDT = HouseKeepingData(
                0,
                cateResult,
                purposeEditTxt.text.toString().trim(),
                DateString,
                moneyEditTxt.text.toString().toInt(),
                contentEidtTxt.text.toString().trim()
            )
            //이때까지 .text 안 써서 고생함 (⓿_⓿)

           val dbHelper = DBHelper.getInstance(this, "HKBook.db",)
           dbHelper.insert(houseKDT)
        }

        InsertMenuBtn.setOnClickListener {
                val intent = Intent(this, MainActivity::class.java)
                startActivity(intent)
        }
   }
}

 

 


특정한 일자를 검색하는 구간

activity_search.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".SearchActivity">

    <Button
            android:text="일자 검색"
            android:layout_width="94dp"
            android:layout_height="50dp" android:id="@+id/SearchSetDateBtn"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.958" app:layout_constraintVertical_bias="0.034"/>
    <DatePicker
            android:id="@+id/SearchDataPicker"
            android:layout_width="421dp"
            android:layout_height="435dp"
            android:calendarViewShown="true"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintVertical_bias="0.189"
            app:layout_constraintHorizontal_bias="0.672"/>
    <TextView
            android:text="검색일"
            android:textSize="20dp"
            android:layout_width="62dp"
            android:layout_height="42dp" android:id="@+id/titleTxt"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintVertical_bias="0.042" app:layout_constraintHorizontal_bias="0.077"/>
    <TextView
            android:textSize="20dp"
            android:layout_width="301dp"
            android:layout_height="46dp" android:id="@+id/resultDateTxt"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintVertical_bias="0.038" app:layout_constraintHorizontal_bias="0.501"/>
    <TextView
            android:text="검색결과"
            android:layout_width="363dp"
            android:layout_height="252dp"
            android:id="@+id/resultOutputTxt"
            android:scrollbars="vertical"
            app:layout_constraintTop_toBottomOf="@+id/resultTxt"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintVertical_bias="0.157" app:layout_constraintHorizontal_bias="0.468"/>
    <TextView
            android:text="결과"
            android:textSize="20dp"
            android:layout_width="62dp"
            android:layout_height="42dp" android:id="@+id/resultTxt"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintVertical_bias="0.602" app:layout_constraintHorizontal_bias="0.044"/>
    <Button
            android:text="메뉴"
            android:layout_width="94dp"
            android:layout_height="50dp" android:id="@+id/SearchMenuBtn"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.968" app:layout_constraintVertical_bias="0.982"/>


</androidx.constraintlayout.widget.ConstraintLayout>

 

SearchActivity.kt
package com.example.housekeepingbook

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.method.ScrollingMovementMethod
import android.widget.Button
import android.widget.DatePicker
import android.widget.TextView

class SearchActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search)

        val SearchMenuBtn = findViewById<Button>(R.id.SearchMenuBtn)
        val SearchDataPicker = findViewById<DatePicker>(R.id.SearchDataPicker)
        val resultOutputTxt = findViewById<TextView>(R.id.resultOutputTxt)
        val resultDateTxt = findViewById<TextView>(R.id.resultDateTxt)
        var resultDate = ""

        val SearchSetDateBtn = findViewById<Button>(R.id.SearchSetDateBtn)

        SearchSetDateBtn.setOnClickListener{
            var dpMonth:String = (SearchDataPicker.month + 1).toString()
            var dpDate:String  = (SearchDataPicker.dayOfMonth).toString()

            if(SearchDataPicker.month + 1<10){
                dpMonth= "0"+"$dpMonth"
            }
            if(SearchDataPicker.dayOfMonth<10){
                dpDate = "0"+"$dpDate"
            }


            resultDate  =
                SearchDataPicker.year.toString() + "-" +
                        dpMonth + "-" +
                        dpDate
            println("resultDate:$resultDate ")

            resultDateTxt.text = resultDate


            val dbHelper = DBHelper.getInstance(this,"HKBook.db",)
            val result = dbHelper.search(resultDate)

            resultOutputTxt.movementMethod = ScrollingMovementMethod.getInstance()
            resultOutputTxt.text = result

        }


        SearchMenuBtn.setOnClickListener {
            val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
        }


    }
}

기간별 검색을 수행하는 구간

activity_find_time.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".FindTimeActivity">

    <DatePicker
            android:id="@+id/findDatePicker2"
            android:layout_width="404dp"
            android:layout_height="87dp"
            android:datePickerMode="spinner"
            android:calendarViewShown="false"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/findDataPicker" app:layout_constraintVertical_bias="0.069"/>
    <DatePicker
            android:id="@+id/findDataPicker"
            android:layout_width="404dp"
            android:layout_height="87dp"
            android:datePickerMode="spinner"
            android:calendarViewShown="false"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.079"/>
    <Button
            android:text="메뉴"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/FIndMenuBtn"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.671"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.406"/>
    <Button
            android:text="검색"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/FindTimeBtn"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.406"
            app:layout_constraintHorizontal_bias="0.328"/>
    <TextView
            android:text="검색 기간"
            android:layout_width="74dp"
            android:layout_height="39dp" android:id="@+id/textView"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.034"
            app:layout_constraintVertical_bias="0.029"/>
    <TextView
            android:text="~"
            android:layout_width="28dp"
            android:layout_height="19dp" android:id="@+id/textView5"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.417"
            app:layout_constraintVertical_bias="0.036"/>
    <TextView
            android:text="검색 결과"
            android:layout_width="141dp"
            android:layout_height="42dp" android:id="@+id/textView2"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.002"
            app:layout_constraintVertical_bias="0.485"/>
    <TextView
            android:text="from"
            android:layout_width="118dp"
            android:layout_height="23dp" android:id="@+id/findFromTxt"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.232"
            app:layout_constraintVertical_bias="0.036"/>
    <TextView
            android:text="to"
            android:layout_width="118dp"
            android:layout_height="23dp" android:id="@+id/findToTxt"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.618"
            app:layout_constraintVertical_bias="0.036"/>
    <androidx.recyclerview.widget.RecyclerView
            android:layout_width="598dp"
            android:layout_height="411dp"
            android:id="@+id/FindRecyclerView" app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="1.0"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"/>


</androidx.constraintlayout.widget.ConstraintLayout>

검색결과를 FindRecyclerView에 출력해준다.

 

view_item_layout.xml (RecyclerView의 item을 구성하는 View)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout

        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_margin="5dp">

    <TextView
            android:id="@+id/RcMoney"
            android:text="금액"
            android:layout_width="104dp"
            android:layout_height="46dp"
            android:textSize="30sp"
            android:textStyle="bold"

            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.46"/>
    <TextView
            android:id="@+id/RcMemo"
            android:text="메모"
            android:layout_width="164dp"
            android:layout_height="48dp"
            android:textSize="15sp"
            android:textStyle="bold"

            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintVertical_bias="0.583" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.962"/>
    <TextView
            android:id="@+id/Rcpurpose"
            android:text="용도"
            android:layout_width="57dp"
            android:layout_height="27dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.219"/>
    <TextView
            android:id="@+id/RcCategory"
            android:text="분류"
            android:layout_width="48dp"
            android:layout_height="28dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.099"/>
    <TextView
            android:id="@+id/RcSeq"
            android:text="번호"
            android:layout_width="34dp"
            android:layout_height="24dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.027" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.01"/>
    <TextView
            android:text="일자"
            android:layout_width="77dp"
            android:layout_height="22dp" android:id="@+id/RCdate"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.868"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.126"/>

</androidx.constraintlayout.widget.ConstraintLayout>

 

view_item_layout.xml 의 디자인 화면

RecyclerView의 아이템은 위와 같이 구성되어 있다.

 

CustomAdapter.kt 
package com.example.housekeepingbook
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView


class CustomAdapter(private val context:Context, private val dataList: ArrayList<HouseKeepingData>)
    :RecyclerView.Adapter<ItemViewHolder>(){
    //RecyclerView에 binding 해줄 Adapter를 연결시킨다.

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val view = LayoutInflater.from(context).inflate(R.layout.view_item_layout,parent, false)
        return ItemViewHolder(view)

    }

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        holder.bind(dataList[position], context)
        //recycleView에 있는 각각의 아이템과 아이템의 위치
    }

    override fun getItemCount(): Int {
        return dataList.size
    }

}

class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
    private val RcSeq = itemView.findViewById<TextView>(R.id.RcSeq)
    private val RcCategory = itemView.findViewById<TextView>(R.id.RcCategory)
    private val Rcpurpose = itemView.findViewById<TextView>(R.id.Rcpurpose)
    private val RcMoney = itemView.findViewById<TextView>(R.id.RcMoney)
    private val RcMemo = itemView.findViewById<TextView>(R.id.RcMemo)
    private val RcDate = itemView.findViewById<TextView>(R.id.RCdate)


    //data -> resource (binding)
    fun bind(dataVo: HouseKeepingData,context: Context){


        //TextView 데이터 세팅 작업
        RcSeq.text = dataVo.seq.toString()
        RcCategory.text = dataVo.category
        Rcpurpose.text =dataVo.purpose
        RcMoney.text = dataVo.money.toString()
        RcMemo.text = dataVo.memo
        RcDate.text = dataVo.date

    }

}

 

FindTimeActivity.kt
package com.example.housekeepingbook

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.*
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class FindTimeActivity : AppCompatActivity() {




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

        val findDataPicker = findViewById<DatePicker>(R.id.findDataPicker)
        val findDatePicker2 = findViewById<DatePicker>(R.id.findDatePicker2)

        val findFromTxt = findViewById<TextView>(R.id.findFromTxt)
        val findToTxt = findViewById<TextView>(R.id.findToTxt)


        val FindTimeBtn = findViewById<Button>(R.id.FindTimeBtn)
        val FIndMenuBtn = findViewById<Button>(R.id.FIndMenuBtn)



        FindTimeBtn.setOnClickListener {

            val fromDate:String
            var frMonth:String = (findDataPicker.month + 1).toString()
            var frDate:String  = (findDataPicker.dayOfMonth).toString()

            if(findDataPicker.month + 1<10){
                frMonth= "0$frMonth"
            }
            if(findDataPicker.dayOfMonth<10){
                frDate = "0$frDate"
            }

            fromDate =
                findDataPicker.year.toString() + "-" + frMonth + "-" + frDate
            println("fromDate:${fromDate}")

            val toDate:String
            var lastMonth:String = (findDatePicker2.month + 1).toString()
            var lastDate:String  = (findDatePicker2.dayOfMonth).toString()

            if(findDatePicker2.month + 1<10){
                lastMonth= "0$lastMonth"
            }
            if(findDatePicker2.dayOfMonth<10){
                lastDate = "0$lastDate"
            }

            toDate =
                findDatePicker2.year.toString() + "-" + lastMonth + "-" + lastDate
            println("toDate:$toDate")

            findFromTxt.text = fromDate
            findToTxt.text = toDate
            val dbHelper = DBHelper.getInstance(this,"HKBook.db",)
            val list = dbHelper.findTime(fromDate,toDate)


            val FindRecyclerView = findViewById<RecyclerView>(R.id.FindRecyclerView)
            val mAdapter = CustomAdapter(this,list)
            FindRecyclerView.adapter = mAdapter


            val layout = LinearLayoutManager(this)
            FindRecyclerView.layoutManager=layout //recycler 뷰에 리니어 레이아웃 적용

            FindRecyclerView.setHasFixedSize(true)


        }

        FIndMenuBtn.setOnClickListener {
            val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
        }
    }
}

 

 

실행화면

메인 화면
특정일자 검색화면
기간별 검색화면

 

 

지금 내 상태

Comments