Make ClickListener single-use

Change the RecyclerView click listener to only be able to be called once in order to eliminate the ViewModel isAlreadyNavigating variables.
This commit is contained in:
OxygenCobalt 2020-10-02 12:28:59 -06:00
parent 8b0c2a7d2e
commit 3a44ce7e43
6 changed files with 28 additions and 62 deletions

View file

@ -47,7 +47,9 @@ class ArtistDetailFragment : Fragment() {
val albumAdapter = DetailAlbumAdapter( val albumAdapter = DetailAlbumAdapter(
ClickListener { ClickListener {
navToAlbum(it) findNavController().navigate(
ArtistDetailFragmentDirections.actionShowAlbum(it.id, false)
)
} }
) )
@ -90,21 +92,4 @@ class ArtistDetailFragment : Fragment() {
return binding.root return binding.root
} }
override fun onResume() {
super.onResume()
detailModel.isAlreadyNavigating = false
}
private fun navToAlbum(album: Album) {
// Don't navigate if an item already has been selected.
if (!detailModel.isAlreadyNavigating) {
detailModel.isAlreadyNavigating = true
findNavController().navigate(
ArtistDetailFragmentDirections.actionShowAlbum(album.id, false)
)
}
}
} }

View file

@ -9,8 +9,6 @@ import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.recycler.SortMode import org.oxycblt.auxio.recycler.SortMode
class DetailViewModel : ViewModel() { class DetailViewModel : ViewModel() {
var isAlreadyNavigating = false
private val mGenreSortMode = MutableLiveData(SortMode.ALPHA_DOWN) private val mGenreSortMode = MutableLiveData(SortMode.ALPHA_DOWN)
val genreSortMode: LiveData<SortMode> get() = mGenreSortMode val genreSortMode: LiveData<SortMode> get() = mGenreSortMode

View file

@ -47,7 +47,9 @@ class GenreDetailFragment : Fragment() {
val albumAdapter = DetailArtistAdapter( val albumAdapter = DetailArtistAdapter(
ClickListener { ClickListener {
navToArtist(it) findNavController().navigate(
GenreDetailFragmentDirections.actionShowArtist(it.id)
)
} }
) )
@ -88,21 +90,4 @@ class GenreDetailFragment : Fragment() {
return binding.root return binding.root
} }
override fun onResume() {
super.onResume()
detailModel.isAlreadyNavigating = false
}
private fun navToArtist(artist: Artist) {
// Don't navigate if an item already has been selected.
if (!detailModel.isAlreadyNavigating) {
detailModel.isAlreadyNavigating = true
findNavController().navigate(
GenreDetailFragmentDirections.actionShowArtist(artist.id)
)
}
}
} }

View file

@ -87,18 +87,8 @@ class LibraryFragment : Fragment() {
return binding.root return binding.root
} }
override fun onResume() {
super.onResume()
libraryModel.isAlreadyNavigating = false
}
private fun navToItem(baseModel: BaseModel) { private fun navToItem(baseModel: BaseModel) {
// Don't navigate if an item has already been selected Log.d(this::class.simpleName, "Navigating to the detail fragment for ${baseModel.name}")
if (!libraryModel.isAlreadyNavigating) {
libraryModel.isAlreadyNavigating = true
Log.d(this::class.simpleName, "Navigating to the detail fragment for $baseModel.name")
findNavController().navigate( findNavController().navigate(
when (baseModel) { when (baseModel) {
@ -111,4 +101,3 @@ class LibraryFragment : Fragment() {
) )
} }
} }
}

View file

@ -9,8 +9,6 @@ import org.oxycblt.auxio.recycler.SortMode
import org.oxycblt.auxio.theme.SHOW_ARTISTS import org.oxycblt.auxio.theme.SHOW_ARTISTS
class LibraryViewModel : ViewModel() { class LibraryViewModel : ViewModel() {
var isAlreadyNavigating = false
// TODO: Move these to prefs when they're added // TODO: Move these to prefs when they're added
private val mShowMode = MutableLiveData(SHOW_ARTISTS) private val mShowMode = MutableLiveData(SHOW_ARTISTS)
val showMode: LiveData<Int> get() = mShowMode val showMode: LiveData<Int> get() = mShowMode

View file

@ -3,8 +3,19 @@ package org.oxycblt.auxio.recycler
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.BaseModel
// RecyclerView click listener // A RecyclerView click listener that can only be called once.
class ClickListener<T>(val onClick: (T) -> Unit) // Primarily used for navigation to prevent bugs when multiple items are selected.
class ClickListener<T>(private val clickAction: (T) -> Unit) {
private var hasClicked = false
fun onClick(item: T) {
if (!hasClicked) {
hasClicked = true
clickAction(item)
}
}
}
// Base Diff callback // Base Diff callback
class DiffCallback<T : BaseModel> : DiffUtil.ItemCallback<T>() { class DiffCallback<T : BaseModel> : DiffUtil.ItemCallback<T>() {