I am new to android programming and am currently taking a course on developing an application To Do List on the MVVM architecture. At this stage (according to the course), the functions of sorting tasks (by date of creation and by name), as well as the functionality of hiding the completed task, were implemented. However, none of these functions work for me. At the same time, no errors are shown when compiling the program and during operation.
@AndroidEntryPoint
class TasksFragment : Fragment(R.layout.fragment_tasks) {
private val viewModel: TasksViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val binding = FragmentTasksBinding.bind(view)
val tasksAdapter = TasksAdapter()
binding.apply {
recyclerViewTasks.apply {
adapter = tasksAdapter
layoutManager = LinearLayoutManager(requireContext())
setHasFixedSize(true)
}
}
viewModel.tasks.observe(viewLifecycleOwner) {
tasksAdapter.submitList(it)
}
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_fragment_tasks, menu)
val searchitem = menu.findItem(R.id.action_search)
val searchView = searchitem.actionView as SearchView
searchView.onQueryTextChanged {
viewModel.searchQuery.value = it
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when(item.itemId) {
R.id.action_sort_by_name -> {
viewModel.sortOrder.value = SortOrder.BY_NAME
true
}
R.id.action_sort_by_date_created -> {
viewModel.sortOrder.value = SortOrder.BY_DATE
true
}
R.id.action_hide_completed_tasks -> {
item.isChecked = !item.isChecked
viewModel.hideCompleted.value = item.isChecked
true
}
R.id.action_delete_all_completed_tasks -> {
true
}
else -> super.onOptionsItemSelected(item)
}
}
And this is my DAO interface:
@Dao
interface TaskDao {
fun getTasks(query: String, sortOrder: SortOrder, hideCompleted: Boolean): Flow<List<Task>> =
when (sortOrder) {
SortOrder.BY_NAME -> getTasksSortedByName(query, hideCompleted)
SortOrder.BY_DATE -> getTasksSortedByDateCreated(query, hideCompleted)
}
@Query("SELECT * FROM task_table WHERE (isCompleted != :hideCompleted OR isCompleted = 0) AND name LIKE '%' || :searchQuery || '%' ORDER BY isImportant DESC, name")
fun getTasksSortedByName(searchQuery: String, hideCompleted: Boolean): Flow<List<Task>>
@Query("SELECT * FROM task_table WHERE (isCompleted != :hideCompleted OR isCompleted = 0) AND name LIKE '%' || :searchQuery || '%' ORDER BY isImportant DESC, createdDate")
fun getTasksSortedByDateCreated(searchQuery: String, hideCompleted: Boolean): Flow<List<Task>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(task: Task)
@Update
suspend fun update(task: Task)
@Delete
suspend fun delete(task: Task)
}
And this is mine TaskViewModel:
@HiltViewModel
class TasksViewModel @Inject constructor(
private val taskDao: TaskDao
) : ViewModel() {
val searchQuery = MutableStateFlow("")
val sortOrder = MutableStateFlow(SortOrder.BY_DATE)
val hideCompleted = MutableStateFlow(false)
private val taskFlow = combine(
searchQuery,
sortOrder,
hideCompleted
) {
query, sortOrder, hideCompleted ->
Triple(query, sortOrder, hideCompleted)
}.flatMapConcat { (query, sortOrder, hideCompleted) ->
taskDao.getTasks(query, sortOrder, hideCompleted)
}
val tasks = taskFlow.asLiveData()
}
enum class SortOrder { BY_NAME, BY_DATE }
Will glad to ask for questions and be very thankful for help.