Fixed satellite entries search behaviour

pull/49/head
Arty Bishop 2020-09-29 21:44:36 +01:00
rodzic 747a7620b0
commit f89a462216
2 zmienionych plików z 78 dodań i 78 usunięć

Wyświetl plik

@ -22,15 +22,88 @@ package com.rtbishop.look4sat.ui.adapters
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.SearchView
import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.data.SatEntry
import com.rtbishop.look4sat.databinding.ItemSatEntryBinding
import java.util.*
class EntriesAdapter(private var entries: MutableList<SatEntry> = mutableListOf()) :
RecyclerView.Adapter<EntriesAdapter.SatEntryHolder>() {
class EntriesAdapter : RecyclerView.Adapter<EntriesAdapter.SatEntryHolder>(),
SearchView.OnQueryTextListener {
private var selectAllToggle = true
private var shouldSearchAll = true
private var allEntries = mutableListOf<SatEntry>()
private var currentEntries = mutableListOf<SatEntry>()
fun getEntries(): MutableList<SatEntry> {
return allEntries
}
fun setEntries(list: MutableList<SatEntry>) {
allEntries = list
currentEntries = list
notifyDataSetChanged()
}
fun selectAll() {
shouldSearchAll = if (shouldSearchAll) {
currentEntries.forEach { it.isSelected = true }
notifyDataSetChanged()
false
} else {
currentEntries.forEach { it.isSelected = false }
notifyDataSetChanged()
true
}
}
private fun filterEntries(list: MutableList<SatEntry>, query: String): MutableList<SatEntry> {
if (query.isEmpty()) return list
return try {
filterByCatNum(list, query.toInt())
} catch (e: NumberFormatException) {
filterByName(list, query)
}
}
private fun filterByCatNum(list: MutableList<SatEntry>, catNum: Int): MutableList<SatEntry> {
return list.filter { it.catNum == catNum } as MutableList
}
private fun filterByName(list: MutableList<SatEntry>, query: String): MutableList<SatEntry> {
val defaultLocale = Locale.getDefault()
val filteredList = mutableListOf<SatEntry>()
val searchQuery = query.toLowerCase(defaultLocale)
list.forEach {
val entryName = it.name.toLowerCase(defaultLocale)
if (entryName.contains(searchQuery)) filteredList.add(it)
}
return filteredList
}
override fun onQueryTextChange(newText: String): Boolean {
currentEntries = filterEntries(getEntries(), newText)
notifyDataSetChanged()
return false
}
override fun onQueryTextSubmit(query: String): Boolean {
return false
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SatEntryHolder {
val binding = ItemSatEntryBinding
.inflate(LayoutInflater.from(parent.context), parent, false)
return SatEntryHolder(binding.root, binding)
}
override fun onBindViewHolder(holder: SatEntryHolder, position: Int) {
holder.bind(currentEntries[position])
}
override fun getItemCount(): Int {
return currentEntries.size
}
inner class SatEntryHolder(itemView: View, private val binding: ItemSatEntryBinding) :
RecyclerView.ViewHolder(itemView) {
@ -43,65 +116,4 @@ class EntriesAdapter(private var entries: MutableList<SatEntry> = mutableListOf(
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SatEntryHolder {
val binding = ItemSatEntryBinding
.inflate(LayoutInflater.from(parent.context), parent, false)
return SatEntryHolder(binding.root, binding)
}
override fun onBindViewHolder(holder: SatEntryHolder, position: Int) {
holder.bind(entries[position])
}
override fun getItemCount(): Int {
return entries.size
}
fun getEntries(): MutableList<SatEntry> {
return entries
}
fun setEntries(list: MutableList<SatEntry>) {
entries = list
notifyDataSetChanged()
}
fun selectAll() {
selectAllToggle = if (selectAllToggle) {
val currentList = getEntries()
currentList.forEach { it.isSelected = true }
setEntries(currentList)
false
} else {
val currentList = getEntries()
currentList.forEach { it.isSelected = false }
setEntries(currentList)
true
}
}
fun filterEntries(list: MutableList<SatEntry>, query: String): MutableList<SatEntry> {
if (query.isEmpty()) return list
return try {
filterByCatNum(list, query.toInt())
} catch (e: NumberFormatException) {
filterByName(list, query)
}
}
private fun filterByCatNum(list: MutableList<SatEntry>, catNum: Int): MutableList<SatEntry> {
val filteredList = list.filter { it.catNum == catNum }
return filteredList as MutableList<SatEntry>
}
private fun filterByName(list: MutableList<SatEntry>, query: String): MutableList<SatEntry> {
val searchQuery = query.toLowerCase(Locale.getDefault())
val filteredList = mutableListOf<SatEntry>()
list.forEach {
val entryName = it.name.toLowerCase(Locale.getDefault())
if (entryName.contains(searchQuery)) filteredList.add(it)
}
return filteredList
}
}

Wyświetl plik

@ -3,7 +3,6 @@ package com.rtbishop.look4sat.ui.fragments
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.SearchView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.res.ResourcesCompat
import androidx.fragment.app.Fragment
@ -22,8 +21,7 @@ import com.rtbishop.look4sat.ui.adapters.EntriesAdapter
import javax.inject.Inject
class EntriesFragment : Fragment(R.layout.fragment_entries),
SourcesDialog.SourcesSubmitListener,
SearchView.OnQueryTextListener {
SourcesDialog.SourcesSubmitListener {
@Inject
lateinit var factory: ViewModelFactory
@ -47,7 +45,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries),
binding.apply {
importWeb.setOnClickListener { showSourcesDialog() }
importFile.setOnClickListener { showFileDialog() }
searchBar.setOnQueryTextListener(this@EntriesFragment)
searchBar.setOnQueryTextListener(entriesAdapter)
selectAll.setOnClickListener { entriesAdapter.selectAll() }
entriesRecycler.apply {
val linearLayoutMgr = LinearLayoutManager(requireContext())
@ -111,14 +109,4 @@ class EntriesFragment : Fragment(R.layout.fragment_entries),
viewModel.updateEntriesSelection(catNumList)
requireView().findNavController().navigate(R.id.action_entries_to_passes)
}
override fun onQueryTextChange(newText: String): Boolean {
val filteredList = entriesAdapter.filterEntries(entriesAdapter.getEntries(), newText)
entriesAdapter.setEntries(filteredList)
return false
}
override fun onQueryTextSubmit(query: String): Boolean {
return false
}
}