introduce generic BindingHolder as replacement for individual ViewHolders

This commit is contained in:
Conny Duck 2020-06-18 17:01:28 +02:00
parent f35734ce74
commit 47afa8818f
7 changed files with 39 additions and 44 deletions

View File

@ -23,6 +23,7 @@ import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import at.connyduck.pixelcat.R import at.connyduck.pixelcat.R
import at.connyduck.pixelcat.components.util.BindingHolder
import at.connyduck.pixelcat.components.util.extension.hide import at.connyduck.pixelcat.components.util.extension.hide
import at.connyduck.pixelcat.components.util.extension.show import at.connyduck.pixelcat.components.util.extension.show
import at.connyduck.pixelcat.databinding.ItemAccountSelectionBinding import at.connyduck.pixelcat.databinding.ItemAccountSelectionBinding
@ -34,17 +35,17 @@ class AccountSelectionAdapter(
private val accounts: List<AccountEntity>, private val accounts: List<AccountEntity>,
private val onAccountSelected: (Long) -> Unit, private val onAccountSelected: (Long) -> Unit,
private val onAddAccount: () -> Unit private val onAddAccount: () -> Unit
) : RecyclerView.Adapter<AccountSelectionViewHolder>() { ) : RecyclerView.Adapter<BindingHolder<ItemAccountSelectionBinding>>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AccountSelectionViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemAccountSelectionBinding> {
val binding = val binding =
ItemAccountSelectionBinding.inflate(LayoutInflater.from(parent.context), parent, false) ItemAccountSelectionBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return AccountSelectionViewHolder(binding) return BindingHolder(binding)
} }
override fun getItemCount() = accounts.size + 1 override fun getItemCount() = accounts.size + 1
override fun onBindViewHolder(holder: AccountSelectionViewHolder, position: Int) { override fun onBindViewHolder(holder: BindingHolder<ItemAccountSelectionBinding>, position: Int) {
val binding = holder.binding val binding = holder.binding
if (position == accounts.size) { if (position == accounts.size) {
binding.accountAvatar.load(R.drawable.ic_plus_background) binding.accountAvatar.load(R.drawable.ic_plus_background)
@ -72,6 +73,3 @@ class AccountSelectionAdapter(
} }
} }
} }
class AccountSelectionViewHolder(val binding: ItemAccountSelectionBinding) :
RecyclerView.ViewHolder(binding.root)

View File

@ -24,8 +24,8 @@ import android.view.ViewGroup
import androidx.core.view.setPadding import androidx.core.view.setPadding
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import at.connyduck.pixelcat.R import at.connyduck.pixelcat.R
import at.connyduck.pixelcat.components.util.BindingHolder
import at.connyduck.pixelcat.databinding.ItemComposeImageBinding import at.connyduck.pixelcat.databinding.ItemComposeImageBinding
import at.connyduck.sparkbutton.helpers.Utils import at.connyduck.sparkbutton.helpers.Utils
import coil.api.load import coil.api.load
@ -37,7 +37,7 @@ interface OnImageActionClickListener {
class ComposeImageAdapter( class ComposeImageAdapter(
private val listener: OnImageActionClickListener private val listener: OnImageActionClickListener
) : ListAdapter<String, ComposeImageViewHolder>( ) : ListAdapter<String, BindingHolder<ItemComposeImageBinding>>(
object : DiffUtil.ItemCallback<String>() { object : DiffUtil.ItemCallback<String>() {
override fun areItemsTheSame(old: String, new: String): Boolean { override fun areItemsTheSame(old: String, new: String): Boolean {
return old == new return old == new
@ -49,13 +49,13 @@ class ComposeImageAdapter(
} }
) { ) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ComposeImageViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemComposeImageBinding> {
val binding = val binding =
ItemComposeImageBinding.inflate(LayoutInflater.from(parent.context), parent, false) ItemComposeImageBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ComposeImageViewHolder(binding) return BindingHolder(binding)
} }
override fun onBindViewHolder(holder: ComposeImageViewHolder, position: Int) { override fun onBindViewHolder(holder: BindingHolder<ItemComposeImageBinding>, position: Int) {
getItem(position)?.let { uri -> getItem(position)?.let { uri ->
@ -80,6 +80,3 @@ class ComposeImageAdapter(
const val ADD_ITEM = "add_item" const val ADD_ITEM = "add_item"
} }
} }
class ComposeImageViewHolder(val binding: ItemComposeImageBinding) :
RecyclerView.ViewHolder(binding.root)

View File

@ -23,6 +23,7 @@ import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import at.connyduck.pixelcat.R import at.connyduck.pixelcat.R
import at.connyduck.pixelcat.components.util.BindingHolder
import at.connyduck.pixelcat.components.util.extension.visible import at.connyduck.pixelcat.components.util.extension.visible
import at.connyduck.pixelcat.databinding.ItemProfileHeaderBinding import at.connyduck.pixelcat.databinding.ItemProfileHeaderBinding
import at.connyduck.pixelcat.model.Account import at.connyduck.pixelcat.model.Account
@ -31,7 +32,7 @@ import coil.api.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import java.text.NumberFormat import java.text.NumberFormat
class ProfileHeaderAdapter : RecyclerView.Adapter<ProfileHeaderViewHolder>() { class ProfileHeaderAdapter : RecyclerView.Adapter<BindingHolder<ItemProfileHeaderBinding>>() {
private var account: Account? = null private var account: Account? = null
private var isSelf: Boolean = false private var isSelf: Boolean = false
@ -48,16 +49,15 @@ class ProfileHeaderAdapter : RecyclerView.Adapter<ProfileHeaderViewHolder>() {
notifyItemChanged(1, RELATIONSHIP_CHANGED) notifyItemChanged(1, RELATIONSHIP_CHANGED)
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProfileHeaderViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemProfileHeaderBinding> {
val binding = ItemProfileHeaderBinding.inflate(LayoutInflater.from(parent.context), parent, false) return BindingHolder(ItemProfileHeaderBinding.inflate(LayoutInflater.from(parent.context), parent, false))
return ProfileHeaderViewHolder(binding)
} }
override fun onBindViewHolder(holder: ProfileHeaderViewHolder, position: Int) { override fun onBindViewHolder(holder: BindingHolder<ItemProfileHeaderBinding>, position: Int) {
// nothing to do // nothing to do
} }
override fun onBindViewHolder(holder: ProfileHeaderViewHolder, position: Int, payloads: List<Any>) { override fun onBindViewHolder(holder: BindingHolder<ItemProfileHeaderBinding>, position: Int, payloads: List<Any>) {
if (payloads.isEmpty() || payloads.contains(ACCOUNT_CHANGED)) { if (payloads.isEmpty() || payloads.contains(ACCOUNT_CHANGED)) {
account?.let { account?.let {
holder.binding.profileName.text = it.username holder.binding.profileName.text = it.username
@ -97,5 +97,3 @@ class ProfileHeaderAdapter : RecyclerView.Adapter<ProfileHeaderViewHolder>() {
const val RELATIONSHIP_CHANGED = "RELATIONSHIP" const val RELATIONSHIP_CHANGED = "RELATIONSHIP"
} }
} }
class ProfileHeaderViewHolder(val binding: ItemProfileHeaderBinding) : RecyclerView.ViewHolder(binding.root)

View File

@ -23,8 +23,8 @@ import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.paging.PagingDataAdapter import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import at.connyduck.pixelcat.R import at.connyduck.pixelcat.R
import at.connyduck.pixelcat.components.util.BindingHolder
import at.connyduck.pixelcat.components.util.extension.hide import at.connyduck.pixelcat.components.util.extension.hide
import at.connyduck.pixelcat.components.util.extension.show import at.connyduck.pixelcat.components.util.extension.show
import at.connyduck.pixelcat.databinding.ItemProfileImageBinding import at.connyduck.pixelcat.databinding.ItemProfileImageBinding
@ -34,7 +34,7 @@ import coil.api.load
class ProfileImageAdapter( class ProfileImageAdapter(
private val imageSizePx: Int private val imageSizePx: Int
) : PagingDataAdapter<Status, ProfileImageViewHolder>( ) : PagingDataAdapter<Status, BindingHolder<ItemProfileImageBinding>>(
object : DiffUtil.ItemCallback<Status>() { object : DiffUtil.ItemCallback<Status>() {
override fun areItemsTheSame(old: Status, new: Status): Boolean { override fun areItemsTheSame(old: Status, new: Status): Boolean {
return false return false
@ -45,15 +45,15 @@ class ProfileImageAdapter(
} }
) { ) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProfileImageViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemProfileImageBinding> {
val binding = ItemProfileImageBinding.inflate(LayoutInflater.from(parent.context), parent, false) val binding = ItemProfileImageBinding.inflate(LayoutInflater.from(parent.context), parent, false)
binding.root.layoutParams = ViewGroup.LayoutParams(imageSizePx, imageSizePx) binding.root.layoutParams = ViewGroup.LayoutParams(imageSizePx, imageSizePx)
return ProfileImageViewHolder(binding) return BindingHolder(binding)
} }
override fun onBindViewHolder(holder: ProfileImageViewHolder, position: Int) { override fun onBindViewHolder(holder: BindingHolder<ItemProfileImageBinding>, position: Int) {
getItem(position)?.let { status -> getItem(position)?.let { status ->
holder.binding.profileImageView.load(status.attachments.firstOrNull()?.previewUrl) holder.binding.profileImageView.load(status.attachments.firstOrNull()?.previewUrl)
@ -74,5 +74,3 @@ class ProfileImageAdapter(
} }
} }
} }
class ProfileImageViewHolder(val binding: ItemProfileImageBinding) : RecyclerView.ViewHolder(binding.root)

View File

@ -22,11 +22,12 @@ package at.connyduck.pixelcat.components.timeline
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import at.connyduck.pixelcat.components.util.BindingHolder
import at.connyduck.pixelcat.databinding.ItemTimelineImageBinding import at.connyduck.pixelcat.databinding.ItemTimelineImageBinding
import at.connyduck.pixelcat.model.Attachment import at.connyduck.pixelcat.model.Attachment
import coil.api.load import coil.api.load
class TimelineImageAdapter : RecyclerView.Adapter<TimelineImageViewHolder>() { class TimelineImageAdapter : RecyclerView.Adapter<BindingHolder<ItemTimelineImageBinding>>() {
var images: List<Attachment> = emptyList() var images: List<Attachment> = emptyList()
set(value) { set(value) {
@ -34,17 +35,14 @@ class TimelineImageAdapter : RecyclerView.Adapter<TimelineImageViewHolder>() {
notifyDataSetChanged() notifyDataSetChanged()
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TimelineImageViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemTimelineImageBinding> {
val binding = ItemTimelineImageBinding.inflate(LayoutInflater.from(parent.context), parent, false) return BindingHolder(ItemTimelineImageBinding.inflate(LayoutInflater.from(parent.context), parent, false))
return TimelineImageViewHolder(binding)
} }
override fun getItemCount() = images.size override fun getItemCount() = images.size
override fun onBindViewHolder(holder: TimelineImageViewHolder, position: Int) { override fun onBindViewHolder(holder: BindingHolder<ItemTimelineImageBinding>, position: Int) {
holder.binding.timelineImageView.load(images[position].previewUrl) holder.binding.timelineImageView.load(images[position].previewUrl)
} }
} }
class TimelineImageViewHolder(val binding: ItemTimelineImageBinding) : RecyclerView.ViewHolder(binding.root)

View File

@ -24,8 +24,8 @@ import android.view.ViewGroup
import androidx.core.text.parseAsHtml import androidx.core.text.parseAsHtml
import androidx.paging.PagingDataAdapter import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import at.connyduck.pixelcat.components.profile.ProfileActivity import at.connyduck.pixelcat.components.profile.ProfileActivity
import at.connyduck.pixelcat.components.util.BindingHolder
import at.connyduck.pixelcat.components.util.extension.visible import at.connyduck.pixelcat.components.util.extension.visible
import at.connyduck.pixelcat.databinding.ItemStatusBinding import at.connyduck.pixelcat.databinding.ItemStatusBinding
import at.connyduck.pixelcat.db.entitity.StatusEntity import at.connyduck.pixelcat.db.entitity.StatusEntity
@ -53,19 +53,19 @@ object TimelineDiffUtil : DiffUtil.ItemCallback<StatusEntity>() {
class TimelineListAdapter( class TimelineListAdapter(
private val displayWidth: Int, private val displayWidth: Int,
private val listener: TimeLineActionListener private val listener: TimeLineActionListener
) : PagingDataAdapter<StatusEntity, TimelineViewHolder>(TimelineDiffUtil) { ) : PagingDataAdapter<StatusEntity, BindingHolder<ItemStatusBinding>>(TimelineDiffUtil) {
private val dateTimeFormatter = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT) private val dateTimeFormatter = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TimelineViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemStatusBinding> {
val binding = ItemStatusBinding.inflate(LayoutInflater.from(parent.context), parent, false) val binding = ItemStatusBinding.inflate(LayoutInflater.from(parent.context), parent, false)
binding.postImages.adapter = TimelineImageAdapter() binding.postImages.adapter = TimelineImageAdapter()
binding.postIndicator.setViewPager(binding.postImages) binding.postIndicator.setViewPager(binding.postImages)
(binding.postImages.adapter as TimelineImageAdapter).registerAdapterDataObserver(binding.postIndicator.adapterDataObserver) (binding.postImages.adapter as TimelineImageAdapter).registerAdapterDataObserver(binding.postIndicator.adapterDataObserver)
return TimelineViewHolder(binding) return BindingHolder(binding)
} }
override fun onBindViewHolder(holder: TimelineViewHolder, position: Int) { override fun onBindViewHolder(holder: BindingHolder<ItemStatusBinding>, position: Int) {
getItem(position)?.let { status -> getItem(position)?.let { status ->
@ -128,5 +128,3 @@ class TimelineListAdapter(
} }
} }
} }
class TimelineViewHolder(val binding: ItemStatusBinding) : RecyclerView.ViewHolder(binding.root)

View File

@ -0,0 +1,8 @@
package at.connyduck.pixelcat.components.util
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
class BindingHolder<T: ViewBinding>(
val binding: T
): RecyclerView.ViewHolder(binding.root)