android:클래스와리스트를사용하기
클래스와리스트를사용하기
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
android:클래스와리스트를사용하기 [2024/08/08 22:59] – 뷰모델 공급자 지정 이거니맨 | android:클래스와리스트를사용하기 [2024/08/09 00:02] (현재) – [4. 버튼 클릭 이벤트] 이거니맨 | ||
---|---|---|---|
줄 193: | 줄 193: | ||
+ | ==== 3. 데이터가 없는 경우에 대한 예외 처리 ==== | ||
+ | TodoListPage.kt는 다음과 같이 수정한다. | ||
+ | |||
+ | fakeTodoList()가 아닌 실시간 Todo ViewModel을 사용하는 것이므로 처음에는 데이터 값이 없다. 따라서 이에 대한 예외를 처리해 줘야 한다. | ||
+ | |||
+ | <code kotlin> | ||
+ | todoList? | ||
+ | LazyColumn( | ||
+ | content = { | ||
+ | itemsIndexed(it) { | ||
+ | index : Int, item : Todo -> | ||
+ | TodoItem(item = item) | ||
+ | } | ||
+ | } | ||
+ | ) | ||
+ | }?: Text( | ||
+ | modifier = Modifier.fillMaxWidth(), | ||
+ | textAlign = TextAlign.Center, | ||
+ | text = "No Items yet", | ||
+ | fontSize = 16.sp | ||
+ | ) | ||
+ | </ | ||
+ | |||
+ | ==== 4. 버튼 클릭 이벤트 ==== | ||
+ | |||
+ | === 가. 추가하기 버튼 ==== | ||
+ | |||
+ | TodoListPage.kt에 다음과 같이 버튼 클릭 이벤트를 추가한다. | ||
+ | |||
+ | <code kotlin> | ||
+ | OutlinedTextField(value = inputText, onValueChange = { | ||
+ | inputText = it | ||
+ | }) | ||
+ | Button(onClick = { viewModel.addTodo(inputText); | ||
+ | Text(text = " | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | === 나. 삭제하기 버튼 === | ||
+ | |||
+ | TodoListPage.kt에 다음과 같이 버튼 클릭 이벤트를 추가한다. | ||
+ | |||
+ | <code kotlin> | ||
+ | TodoItem(item = item, onDelete = {viewModel.deleteTodo(item.id)}) | ||
+ | </ | ||
+ | |||
+ | 위와 같이 onDelete라는 대리자를 지정했으므로 다음과 같이 TodoItem함수를 바꿔준다. | ||
+ | |||
+ | <code kotlin> | ||
+ | fun TodoItem(item : Todo, onDelete : ()-> Unit) { | ||
+ | |||
+ | (중략) | ||
+ | |||
+ | IconButton(onClick = onDelete ) { | ||
+ | (후략) | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== 다. 전체 코드 ==== | ||
+ | |||
+ | TodoListPage.kt의 전체 코드는 다음과 같다. | ||
+ | |||
+ | <file kotlin " | ||
+ | package com.dklaw.gogo2.pages | ||
+ | |||
+ | import androidx.compose.foundation.background | ||
+ | import androidx.compose.foundation.layout.Arrangement | ||
+ | import androidx.compose.foundation.layout.Column | ||
+ | import androidx.compose.foundation.layout.Row | ||
+ | import androidx.compose.foundation.layout.Spacer | ||
+ | import androidx.compose.foundation.layout.fillMaxHeight | ||
+ | import androidx.compose.foundation.layout.fillMaxWidth | ||
+ | import androidx.compose.foundation.layout.height | ||
+ | import androidx.compose.foundation.layout.padding | ||
+ | import androidx.compose.foundation.lazy.LazyColumn | ||
+ | import androidx.compose.foundation.lazy.itemsIndexed | ||
+ | import androidx.compose.foundation.shape.RoundedCornerShape | ||
+ | import androidx.compose.material3.Button | ||
+ | import androidx.compose.material3.Icon | ||
+ | import androidx.compose.material3.IconButton | ||
+ | import androidx.compose.material3.MaterialTheme | ||
+ | import androidx.compose.material3.OutlinedTextField | ||
+ | import androidx.compose.material3.Text | ||
+ | import androidx.compose.runtime.Composable | ||
+ | import androidx.compose.runtime.getValue | ||
+ | import androidx.compose.runtime.livedata.observeAsState | ||
+ | import androidx.compose.runtime.mutableStateOf | ||
+ | import androidx.compose.runtime.remember | ||
+ | import androidx.compose.runtime.setValue | ||
+ | import androidx.compose.ui.Alignment | ||
+ | import androidx.compose.ui.Modifier | ||
+ | import androidx.compose.ui.draw.clip | ||
+ | import androidx.compose.ui.graphics.Color | ||
+ | import androidx.compose.ui.res.painterResource | ||
+ | import androidx.compose.ui.text.style.TextAlign | ||
+ | import androidx.compose.ui.unit.dp | ||
+ | import androidx.compose.ui.unit.sp | ||
+ | import com.dklaw.gogo2.R | ||
+ | import com.dklaw.gogo2.database.Todo | ||
+ | import com.dklaw.gogo2.database.TodoViewModel | ||
+ | import java.time.format.DateTimeFormatter | ||
+ | |||
+ | @Composable | ||
+ | fun ContactsPage(viewModel: | ||
+ | |||
+ | val todoList by viewModel.todoList.observeAsState() | ||
+ | var inputText by remember { mutableStateOf("" | ||
+ | |||
+ | |||
+ | |||
+ | Column(modifier = Modifier | ||
+ | .fillMaxHeight() | ||
+ | .padding(8.dp), | ||
+ | { | ||
+ | Spacer(modifier = Modifier.height(32.dp)) | ||
+ | Text(text = " | ||
+ | |||
+ | Row (modifier = Modifier | ||
+ | .fillMaxWidth() | ||
+ | .padding(8.dp), | ||
+ | OutlinedTextField(value = inputText, onValueChange = { | ||
+ | inputText = it | ||
+ | }) | ||
+ | Button(onClick = { viewModel.addTodo(inputText) }) { | ||
+ | Text(text = " | ||
+ | inputText = "" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | todoList? | ||
+ | LazyColumn( | ||
+ | content = { | ||
+ | itemsIndexed(it) { | ||
+ | index : Int, item : Todo -> | ||
+ | TodoItem(item = item, onDelete = {viewModel.deleteTodo(item.id)}) | ||
+ | } | ||
+ | } | ||
+ | ) | ||
+ | }?: Text( | ||
+ | modifier = Modifier.fillMaxWidth(), | ||
+ | textAlign = TextAlign.Center, | ||
+ | text = "No Items yet", | ||
+ | fontSize = 16.sp | ||
+ | ) | ||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | @Composable | ||
+ | fun TodoItem(item : Todo, onDelete : ()-> Unit) { | ||
+ | val timeFormater : DateTimeFormatter = DateTimeFormatter.ofPattern(" | ||
+ | val nowString = item.createdAt.format(timeFormater) | ||
+ | |||
+ | Row (modifier = Modifier | ||
+ | .fillMaxWidth() | ||
+ | .padding(8.dp) | ||
+ | .clip(RoundedCornerShape(16.dp)) | ||
+ | .background(MaterialTheme.colorScheme.primary) | ||
+ | .padding(16.dp), | ||
+ | verticalAlignment = Alignment.CenterVertically | ||
+ | ) { | ||
+ | Column (modifier = Modifier.weight(1f)){ | ||
+ | Text(text = nowString, fontSize = 10.sp, color = Color.LightGray) | ||
+ | Text(text = item.title, fontSize = 20.sp, color = Color.White) | ||
+ | } | ||
+ | IconButton(onClick = onDelete ) { | ||
+ | Icon(painter = painterResource(id = R.drawable.baseline_delete_24), | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ |
android/클래스와리스트를사용하기.1723125551.txt.gz · 마지막으로 수정됨: 2024/08/08 22:59 저자 이거니맨