Skip to content

Commit aa3ece0

Browse files
committed
End of part 9
1 parent 77d8d8f commit aa3ece0

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

app/src/main/java/com/codinginflow/mvvmtodo/ui/tasks/TasksAdapter.kt

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import androidx.recyclerview.widget.RecyclerView
99
import com.codinginflow.mvvmtodo.data.Task
1010
import com.codinginflow.mvvmtodo.databinding.ItemTaskBinding
1111

12-
class TasksAdapter : ListAdapter<Task, TasksAdapter.TasksViewHolder>(DiffCallback()) {
12+
class TasksAdapter(private val listener: OnItemClickListener) : ListAdapter<Task, TasksAdapter.TasksViewHolder>(DiffCallback()) {
1313

1414
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TasksViewHolder {
1515
val binding = ItemTaskBinding.inflate(LayoutInflater.from(parent.context), parent, false)
@@ -21,7 +21,26 @@ class TasksAdapter : ListAdapter<Task, TasksAdapter.TasksViewHolder>(DiffCallbac
2121
holder.bind(currentItem)
2222
}
2323

24-
class TasksViewHolder(private val binding: ItemTaskBinding) : RecyclerView.ViewHolder(binding.root) {
24+
inner class TasksViewHolder(private val binding: ItemTaskBinding) : RecyclerView.ViewHolder(binding.root) {
25+
26+
init {
27+
binding.apply {
28+
root.setOnClickListener {
29+
val position = adapterPosition
30+
if (position != RecyclerView.NO_POSITION) {
31+
val task = getItem(position)
32+
listener.onItemClick(task)
33+
}
34+
}
35+
checkBoxCompleted.setOnClickListener {
36+
val position = adapterPosition
37+
if (position != RecyclerView.NO_POSITION) {
38+
val task = getItem(position)
39+
listener.onCheckBoxClick(task, checkBoxCompleted.isChecked)
40+
}
41+
}
42+
}
43+
}
2544

2645
fun bind(task: Task) {
2746
binding.apply {
@@ -33,6 +52,11 @@ class TasksAdapter : ListAdapter<Task, TasksAdapter.TasksViewHolder>(DiffCallbac
3352
}
3453
}
3554

55+
interface OnItemClickListener {
56+
fun onItemClick(task: Task)
57+
fun onCheckBoxClick(task: Task, isChecked: Boolean)
58+
}
59+
3660
class DiffCallback : DiffUtil.ItemCallback<Task>() {
3761
override fun areItemsTheSame(oldItem: Task, newItem: Task) =
3862
oldItem.id == newItem.id

app/src/main/java/com/codinginflow/mvvmtodo/ui/tasks/TasksFragment.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@ import androidx.lifecycle.lifecycleScope
1212
import androidx.recyclerview.widget.LinearLayoutManager
1313
import com.codinginflow.mvvmtodo.R
1414
import com.codinginflow.mvvmtodo.data.SortOrder
15+
import com.codinginflow.mvvmtodo.data.Task
1516
import com.codinginflow.mvvmtodo.databinding.FragmentTasksBinding
1617
import com.codinginflow.mvvmtodo.util.onQueryTextChanged
1718
import dagger.hilt.android.AndroidEntryPoint
1819
import kotlinx.coroutines.flow.first
1920
import kotlinx.coroutines.launch
2021

2122
@AndroidEntryPoint
22-
class TasksFragment : Fragment(R.layout.fragment_tasks) {
23+
class TasksFragment : Fragment(R.layout.fragment_tasks), TasksAdapter.OnItemClickListener {
2324

2425
private val viewModel: TasksViewModel by viewModels()
2526

@@ -28,7 +29,7 @@ class TasksFragment : Fragment(R.layout.fragment_tasks) {
2829

2930
val binding = FragmentTasksBinding.bind(view)
3031

31-
val taskAdapter = TasksAdapter()
32+
val taskAdapter = TasksAdapter(this)
3233

3334
binding.apply {
3435
recyclerViewTasks.apply {
@@ -45,6 +46,14 @@ class TasksFragment : Fragment(R.layout.fragment_tasks) {
4546
setHasOptionsMenu(true)
4647
}
4748

49+
override fun onItemClick(task: Task) {
50+
viewModel.onTaskSelected(task)
51+
}
52+
53+
override fun onCheckBoxClick(task: Task, isChecked: Boolean) {
54+
viewModel.onTaskCheckedChanged(task, isChecked)
55+
}
56+
4857
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
4958
inflater.inflate(R.menu.menu_fragment_tasks, menu)
5059

app/src/main/java/com/codinginflow/mvvmtodo/ui/tasks/TasksViewModel.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.lifecycle.asLiveData
66
import androidx.lifecycle.viewModelScope
77
import com.codinginflow.mvvmtodo.data.PreferencesManager
88
import com.codinginflow.mvvmtodo.data.SortOrder
9+
import com.codinginflow.mvvmtodo.data.Task
910
import com.codinginflow.mvvmtodo.data.TaskDao
1011
import kotlinx.coroutines.flow.MutableStateFlow
1112
import kotlinx.coroutines.flow.combine
@@ -30,6 +31,8 @@ class TasksViewModel @ViewModelInject constructor(
3031
taskDao.getTasks(query, filterPreferences.sortOrder, filterPreferences.hideCompleted)
3132
}
3233

34+
val tasks = tasksFlow.asLiveData()
35+
3336
fun onSortOrderSelected(sortOrder: SortOrder) = viewModelScope.launch {
3437
preferencesManager.updateSortOrder(sortOrder)
3538
}
@@ -38,5 +41,9 @@ class TasksViewModel @ViewModelInject constructor(
3841
preferencesManager.updateHideCompleted(hideCompleted)
3942
}
4043

41-
val tasks = tasksFlow.asLiveData()
44+
fun onTaskSelected(task: Task) {}
45+
46+
fun onTaskCheckedChanged(task: Task, isChecked: Boolean) = viewModelScope.launch {
47+
taskDao.update(task.copy(completed = isChecked))
48+
}
4249
}

0 commit comments

Comments
 (0)