ViewBinding in some Adapter classes which are using one layout

This commit is contained in:
Prathamesh More 2021-12-30 16:50:29 +05:30
parent 77e1c653be
commit 2055795c99
8 changed files with 131 additions and 150 deletions

View file

@ -11,134 +11,111 @@
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
*/ */
package code.name.monkey.retromusic.adapter
package code.name.monkey.retromusic.adapter; import android.annotation.SuppressLint
import android.content.res.ColorStateList
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.PreferenceDialogLibraryCategoriesListitemBinding
import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.SwipeAndDragHelper
import code.name.monkey.retromusic.util.SwipeAndDragHelper.ActionCompletionContract
import android.annotation.SuppressLint; class CategoryInfoAdapter : RecyclerView.Adapter<CategoryInfoAdapter.ViewHolder>(),
import android.content.res.ColorStateList; ActionCompletionContract {
import android.view.LayoutInflater; var categoryInfos: MutableList<CategoryInfo> =
import android.view.MotionEvent; PreferenceUtil.libraryCategory.toMutableList()
import android.view.View; @SuppressLint("NotifyDataSetChanged")
import android.view.ViewGroup; set(value) {
import android.widget.TextView; field = value
import android.widget.Toast; notifyDataSetChanged()
}
import androidx.annotation.NonNull; private val touchHelper: ItemTouchHelper
import androidx.recyclerview.widget.ItemTouchHelper; fun attachToRecyclerView(recyclerView: RecyclerView?) {
import androidx.recyclerview.widget.RecyclerView; touchHelper.attachToRecyclerView(recyclerView)
import com.google.android.material.checkbox.MaterialCheckBox;
import java.util.List;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.model.CategoryInfo;
import code.name.monkey.retromusic.util.SwipeAndDragHelper;
public class CategoryInfoAdapter extends RecyclerView.Adapter<CategoryInfoAdapter.ViewHolder>
implements SwipeAndDragHelper.ActionCompletionContract {
private List<CategoryInfo> categoryInfos;
private final ItemTouchHelper touchHelper;
public CategoryInfoAdapter() {
SwipeAndDragHelper swipeAndDragHelper = new SwipeAndDragHelper(this);
touchHelper = new ItemTouchHelper(swipeAndDragHelper);
} }
public void attachToRecyclerView(RecyclerView recyclerView) { override fun getItemCount(): Int {
touchHelper.attachToRecyclerView(recyclerView); return categoryInfos.size
}
@NonNull
public List<CategoryInfo> getCategoryInfos() {
return categoryInfos;
}
public void setCategoryInfos(@NonNull List<CategoryInfo> categoryInfos) {
this.categoryInfos = categoryInfos;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return categoryInfos.size();
} }
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override override fun onBindViewHolder(holder: ViewHolder, position: Int) {
public void onBindViewHolder(@NonNull CategoryInfoAdapter.ViewHolder holder, int position) { val categoryInfo = categoryInfos[position]
CategoryInfo categoryInfo = categoryInfos.get(position); holder.binding.checkbox.isChecked = categoryInfo.visible
holder.binding.title.text =
holder.checkBox.setChecked(categoryInfo.isVisible()); holder.binding.title.resources.getString(categoryInfo.category.stringRes)
holder.title.setText( holder.itemView.setOnClickListener {
holder.title.getResources().getString(categoryInfo.getCategory().getStringRes())); if (!(categoryInfo.visible && isLastCheckedCategory(categoryInfo))) {
categoryInfo.visible = !categoryInfo.visible
holder.itemView.setOnClickListener( holder.binding.checkbox.isChecked = categoryInfo.visible
v -> {
if (!(categoryInfo.isVisible() && isLastCheckedCategory(categoryInfo))) {
categoryInfo.setVisible(!categoryInfo.isVisible());
holder.checkBox.setChecked(categoryInfo.isVisible());
} else { } else {
Toast.makeText( Toast.makeText(
holder.itemView.getContext(), holder.itemView.context,
R.string.you_have_to_select_at_least_one_category, R.string.you_have_to_select_at_least_one_category,
Toast.LENGTH_SHORT) Toast.LENGTH_SHORT
.show(); )
.show()
} }
});
holder.dragView.setOnTouchListener(
(view, event) -> {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
touchHelper.startDrag(holder);
} }
return false; holder.binding.dragView.setOnTouchListener { _: View?, event: MotionEvent ->
}); if (event.actionMasked == MotionEvent.ACTION_DOWN) {
touchHelper.startDrag(holder)
}
false
}
} }
@Override override fun onCreateViewHolder(
@NonNull parent: ViewGroup, viewType: Int
public CategoryInfoAdapter.ViewHolder onCreateViewHolder( ): ViewHolder {
@NonNull ViewGroup parent, int viewType) { return ViewHolder(
View view = PreferenceDialogLibraryCategoriesListitemBinding.inflate(
LayoutInflater.from(parent.getContext()) LayoutInflater.from(
.inflate(R.layout.preference_dialog_library_categories_listitem, parent, false); parent.context
return new ViewHolder(view); ), parent, false
)
)
} }
@Override override fun onViewMoved(oldPosition: Int, newPosition: Int) {
public void onViewMoved(int oldPosition, int newPosition) { val categoryInfo = categoryInfos[oldPosition]
CategoryInfo categoryInfo = categoryInfos.get(oldPosition); categoryInfos.removeAt(oldPosition)
categoryInfos.remove(oldPosition); categoryInfos.add(newPosition, categoryInfo)
categoryInfos.add(newPosition, categoryInfo); notifyItemMoved(oldPosition, newPosition)
notifyItemMoved(oldPosition, newPosition);
} }
private boolean isLastCheckedCategory(CategoryInfo categoryInfo) { private fun isLastCheckedCategory(categoryInfo: CategoryInfo): Boolean {
if (categoryInfo.isVisible()) { if (categoryInfo.visible) {
for (CategoryInfo c : categoryInfos) { for (c in categoryInfos) {
if (c != categoryInfo && c.isVisible()) { if (c !== categoryInfo && c.visible) {
return false; return false
} }
} }
} }
return true; return true
} }
static class ViewHolder extends RecyclerView.ViewHolder { class ViewHolder(val binding: PreferenceDialogLibraryCategoriesListitemBinding) :
private final MaterialCheckBox checkBox; RecyclerView.ViewHolder(binding.root) {
private final View dragView;
private final TextView title;
ViewHolder(View view) { init {
super(view); binding.checkbox.buttonTintList =
checkBox = view.findViewById(R.id.checkbox); ColorStateList.valueOf(accentColor(binding.checkbox.context))
checkBox.setButtonTintList(
ColorStateList.valueOf(ThemeStore.Companion.accentColor(checkBox.getContext())));
title = view.findViewById(R.id.title);
dragView = view.findViewById(R.id.drag_view);
} }
} }
init {
val swipeAndDragHelper = SwipeAndDragHelper(this)
touchHelper = ItemTouchHelper(swipeAndDragHelper)
}
} }

View file

@ -14,6 +14,7 @@
*/ */
package code.name.monkey.retromusic.adapter package code.name.monkey.retromusic.adapter
import android.annotation.SuppressLint
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@ -21,7 +22,7 @@ import android.view.ViewOutlineProvider
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder import code.name.monkey.retromusic.databinding.ItemGenreBinding
import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
@ -38,7 +39,6 @@ import java.util.*
class GenreAdapter( class GenreAdapter(
private val activity: FragmentActivity, private val activity: FragmentActivity,
var dataSet: List<Genre>, var dataSet: List<Genre>,
private val mItemLayoutRes: Int,
private val listener: IGenreClickListener private val listener: IGenreClickListener
) : RecyclerView.Adapter<GenreAdapter.ViewHolder>() { ) : RecyclerView.Adapter<GenreAdapter.ViewHolder>() {
@ -51,13 +51,13 @@ class GenreAdapter(
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(activity).inflate(mItemLayoutRes, parent, false)) return ViewHolder(ItemGenreBinding.inflate(LayoutInflater.from(activity), parent, false))
} }
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val genre = dataSet[position] val genre = dataSet[position]
holder.title?.text = genre.name holder.binding.title.text = genre.name
holder.text?.text = String.format( holder.binding.text.text = String.format(
Locale.getDefault(), Locale.getDefault(),
"%d %s", "%d %s",
genre.songCount, genre.songCount,
@ -72,33 +72,39 @@ class GenreAdapter(
.asBitmapPalette() .asBitmapPalette()
.load(RetroGlideExtension.getSongModel(genreSong)) .load(RetroGlideExtension.getSongModel(genreSong))
.songCoverOptions(genreSong) .songCoverOptions(genreSong)
.into(object : RetroMusicColoredTarget(holder.image!!) { .into(object : RetroMusicColoredTarget(holder.binding.image) {
override fun onColorReady(colors: MediaNotificationProcessor) { override fun onColorReady(colors: MediaNotificationProcessor) {
setColors(holder, colors) setColors(holder, colors)
} }
}) })
// Just for a bit of shadow around image // Just for a bit of shadow around image
holder.image?.outlineProvider = ViewOutlineProvider.BOUNDS holder.binding.image.outlineProvider = ViewOutlineProvider.BOUNDS
} }
private fun setColors(holder: ViewHolder, color: MediaNotificationProcessor) { private fun setColors(holder: ViewHolder, color: MediaNotificationProcessor) {
holder.imageContainerCard?.setCardBackgroundColor(color.backgroundColor) holder.binding.imageContainerCard.setCardBackgroundColor(color.backgroundColor)
holder.title?.setTextColor(color.primaryTextColor) holder.binding.title.setTextColor(color.primaryTextColor)
holder.text?.setTextColor(color.secondaryTextColor) holder.binding.text.setTextColor(color.secondaryTextColor)
} }
override fun getItemCount(): Int { override fun getItemCount(): Int {
return dataSet.size return dataSet.size
} }
@SuppressLint("NotifyDataSetChanged")
fun swapDataSet(list: List<Genre>) { fun swapDataSet(list: List<Genre>) {
dataSet = list dataSet = list
notifyDataSetChanged() notifyDataSetChanged()
} }
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { inner class ViewHolder(val binding: ItemGenreBinding) : RecyclerView.ViewHolder(binding.root),
View.OnClickListener {
override fun onClick(v: View?) { override fun onClick(v: View?) {
listener.onClickGenre(dataSet[layoutPosition], itemView) listener.onClickGenre(dataSet[layoutPosition], itemView)
} }
init {
itemView.setOnClickListener(this)
}
} }
} }

View file

@ -248,7 +248,6 @@ class HomeAdapter(
val genreAdapter = GenreAdapter( val genreAdapter = GenreAdapter(
activity, activity,
home.arrayList as List<Genre>, home.arrayList as List<Genre>,
R.layout.item_grid_genre,
this@HomeAdapter this@HomeAdapter
) )
recyclerView.apply { recyclerView.apply {

View file

@ -1,15 +1,14 @@
package code.name.monkey.retromusic.adapter.backup package code.name.monkey.retromusic.adapter.backup
import android.annotation.SuppressLint
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ItemListBackupBinding
import java.io.File import java.io.File
@ -21,27 +20,27 @@ class BackupAdapter(
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder( return ViewHolder(
LayoutInflater.from(activity).inflate(R.layout.item_list_backup, parent, false) ItemListBackupBinding.inflate(LayoutInflater.from(activity), parent, false)
) )
} }
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.title.text = dataSet[position].nameWithoutExtension holder.binding.title.text = dataSet[position].nameWithoutExtension
} }
override fun getItemCount(): Int = dataSet.size override fun getItemCount(): Int = dataSet.size
@SuppressLint("NotifyDataSetChanged")
fun swapDataset(dataSet: List<File>) { fun swapDataset(dataSet: List<File>) {
this.dataSet = ArrayList(dataSet) this.dataSet = ArrayList(dataSet)
notifyDataSetChanged() notifyDataSetChanged()
} }
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { inner class ViewHolder(val binding: ItemListBackupBinding) :
val title: TextView = itemView.findViewById(R.id.title) RecyclerView.ViewHolder(binding.root) {
val menu: AppCompatImageView = itemView.findViewById(R.id.menu)
init { init {
menu.setOnClickListener { view -> binding.menu.setOnClickListener { view ->
val popupMenu = PopupMenu(activity, view) val popupMenu = PopupMenu(activity, view)
popupMenu.inflate(R.menu.menu_backup) popupMenu.inflate(R.menu.menu_backup)
popupMenu.setOnMenuItemClickListener { menuItem -> popupMenu.setOnMenuItemClickListener { menuItem ->

View file

@ -164,7 +164,7 @@ abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : Recycle
if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) { if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) {
binding.recyclerView.updatePadding(bottom = dip(R.dimen.mini_player_height_expanded)) binding.recyclerView.updatePadding(bottom = dip(R.dimen.mini_player_height_expanded))
} else { } else {
binding.recyclerView.updatePadding(bottom = dip(R.dimen.mini_player_height)) binding.recyclerView.updatePadding(bottom = dip(R.dimen.bottom_nav_height))
} }
} }

View file

@ -62,7 +62,7 @@ GenresFragment : AbsRecyclerViewFragment<GenreAdapter, LinearLayoutManager>(),
override fun createAdapter(): GenreAdapter { override fun createAdapter(): GenreAdapter {
val dataSet = if (adapter == null) ArrayList() else adapter!!.dataSet val dataSet = if (adapter == null) ArrayList() else adapter!!.dataSet
return GenreAdapter(requireActivity(), dataSet, R.layout.item_genre, this) return GenreAdapter(requireActivity(), dataSet, this)
} }
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {

View file

@ -55,7 +55,6 @@ class LibraryPreferenceDialog : DialogFragment() {
.inflate(R.layout.preference_dialog_library_categories, null) .inflate(R.layout.preference_dialog_library_categories, null)
val categoryAdapter = CategoryInfoAdapter() val categoryAdapter = CategoryInfoAdapter()
categoryAdapter.categoryInfos = PreferenceUtil.libraryCategory
val recyclerView = view.findViewById<RecyclerView>(R.id.recycler_view) val recyclerView = view.findViewById<RecyclerView>(R.id.recycler_view)
recyclerView.layoutManager = LinearLayoutManager(activity) recyclerView.layoutManager = LinearLayoutManager(activity)
recyclerView.adapter = categoryAdapter recyclerView.adapter = categoryAdapter

View file

@ -20,11 +20,12 @@
android:layout_height="40dp" android:layout_height="40dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:padding="8dp"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/ic_restore"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/title" app:layout_constraintEnd_toStartOf="@id/title"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
android:src="@drawable/ic_restore"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView