Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 오버라이딩
- TypeScript
- Hook
- array
- scrollview
- 랜덤번호
- stylesheet
- Kotlin
- 스프링부트
- RecyclerView
- button
- JavaScript
- Java
- Javscript
- 구글맵스
- GoogleMaps
- 리액트
- 코틀린
- Android
- nodejs
- JS
- React
- TextView
- SpringBoot
- Linux
- 자바스크립트
- fragment
- 랜덤넘버
- npm
- 안드로이드
Archives
- Today
- Total
타닥타닥 개발자의 일상
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>
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)
}
}
}
실행화면
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/034.gif)
지금 내 상태
'코딩 기록 > Kotlin' 카테고리의 다른 글
Comments