이번 시간에는 ToDo List 만들기 세 번째 시간 메인 화면과 메인 코드를 만들어 보겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.09.15 - [안드로이드] - [안드로이드 코틀린] SQLite ToDo List 만드는 방법 part2 - 할 일 화면과 어댑터 클래스
- 설명 -
1. 입력하는 레이아웃 LinearLayout
2. 리스트 레이아웃 LinearLayout
3. 등록 및 수정하는 FloatingActionButton
4. 입력 모드일 땐 FloatingActionButton 숨기기
5. 리스트 모드일 땐 입력 레이아웃 숨기기
6. 아이콘 res -> drawable
<?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>
- 설명 -
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) 뒤로 가기 버튼 만드는 방법
2022.09.08 - [안드로이드] - [안드로이드 코틀린] 달력(DatePicker) 코드에서 호출하는 방법
2022.09.07 - [안드로이드] - [안드로이드 코틀린] 뒤로 가기 두 번 눌러 종료하는 방법
[안드로이드 코틀린] 코드(MainActivity) 에서 배경 색상 바꾸는 다양한 방법 (0) | 2022.09.20 |
---|---|
[안드로이드 코틀린] RecyclerView 홀수 행, 짝수 행 별 색상 다르게 하는 방법 (0) | 2022.09.19 |
[안드로이드 코틀린] SQLite ToDo List 만드는 방법 part2 - 할 일 화면과 어댑터 클래스 (0) | 2022.09.15 |
[안드로이드 코틀린] SQLite ToDo List 만드는 방법 part1 - Data 클래스와 DB 클래스 (0) | 2022.09.14 |
[안드로이드 코틀린] 액티비티(Activity) 뒤로가기 버튼 만드는 방법 (1) | 2022.09.13 |
댓글 영역