2024/4/9
跟着教程写todoapplication
package com.example.to_do_application.fragments.list
import android.app.AlertDialog
import android.os.Bundle
import android.view.*
import androidx.appcompat.widget.SearchView
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.*
import com.example.to_do_application.R
import com.example.to_do_application.data.models.ToDoData
import com.example.to_do_application.data.viewmodel.ToDoViewModel
import com.example.to_do_application.databinding.FragmentListBinding
import com.example.to_do_application.fragments.SharedViewModel
import com.example.to_do_application.fragments.list.adapter.ListAdapter
import com.google.android.material.snackbar.Snackbar
class ListFragment : Fragment(), SearchView.OnQueryTextListener {
private val mToDoViewModel: ToDoViewModel by viewModels()
private val mSharedViewModel: SharedViewModel by viewModels()
private var _binding: FragmentListBinding? = null
private val binding get() = _binding!!
private val adapter: ListAdapter by lazy { ListAdapter() }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Data Binding
_binding = FragmentListBinding.inflate(inflater,container,false)
binding.lifecycleOwner = this
binding.mSharedViewModel = mSharedViewModel
//SetUp RecyclerView
setupRecyclerview()
//Observe LiveData
mToDoViewModel.getAllData.observe(viewLifecycleOwner, Observer { data ->
mSharedViewModel.checkIfDatabaseEmpty(data)
adapter.setData(data)
})
//set menu
setHasOptionsMenu(true)
return binding.root;
}
private fun setupRecyclerview() {
val recyclerView = binding.recyclerView
recyclerView.adapter = adapter
recyclerView.layoutManager = StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)
//Swip to Delete
swipeToDelete(recyclerView)
}
private fun swipeToDelete(recyclerView: RecyclerView){
val swipeToDeleteCallback = object : SwipeToDelete(){
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val deleteItem = adapter.dataList[viewHolder.adapterPosition]
//Delete Item
mToDoViewModel.deleteData(deleteItem)
adapter.notifyItemRemoved(viewHolder.adapterPosition)
Toast.makeText(requireContext(),"Successfully Removed: '${deleteItem.tile}'",Toast.LENGTH_SHORT).show()
//Restore Delete Item
restoreDeleteData(viewHolder.itemView,deleteItem)
}
}
val itemTouchHelper = ItemTouchHelper(swipeToDeleteCallback)
itemTouchHelper.attachToRecyclerView(recyclerView)
}
private fun restoreDeleteData(view: View,deleteItem:ToDoData){
val snackbar = Snackbar.make(
view,"Delete '${deleteItem.tile}'",
Snackbar.LENGTH_SHORT
)
snackbar.setAction("Undo"){
mToDoViewModel.insertData(deleteItem)
}
snackbar.show()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.list_fragment_menu,menu)
val search = menu.findItem(R.id.menu_search)
val searchView = search.actionView as? SearchView
searchView?.isSubmitButtonEnabled = true
searchView?.setOnQueryTextListener(this)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId){
R.id.menu_delete_all -> confirmRemoval()
R.id.menu_priority_high -> mToDoViewModel.sortByHighPriority.observe(this,Observer{adapter.setData(it)})
R.id.menu_priority_low -> mToDoViewModel.sortByLowPriority.observe(this,Observer{adapter.setData(it)})
}
return super.onContextItemSelected(item)
}
override fun onQueryTextSubmit(query: String?): Boolean {
if(query != null){
searchThroughDatabase(query)
}
return true
}
override fun onQueryTextChange(query: String?): Boolean {
if(query != null){
searchThroughDatabase(query)
}
return true
}
private fun searchThroughDatabase(query: String) {
var searchQuery = query
searchQuery = "%$searchQuery%"
mToDoViewModel.searchDatabase(searchQuery).observe(this,Observer{list->
list?.let{
adapter.setData(it)
}
})
}
//Show AlertDialog to Confirm Removal All Item from Database Table
private fun confirmRemoval() {
val builder = AlertDialog.Builder(requireContext())
builder.setPositiveButton("Yes"){_,_ ->
mToDoViewModel.deletaAll()
Toast.makeText(
requireContext(),
"Successfully Removed Everything",
Toast.LENGTH_SHORT
).show()
}
builder.setNegativeButton("No"){_,_ ->}
builder.setTitle("Delete Everything?")
builder.setMessage("Are you sure you want to remove Everything?")
builder.create().show()
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
package com.example.to_do_application.fragments.list
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
abstract class SwipeToDelete: ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT){
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
}

浙公网安备 33010602011771号