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 androidx.recyclerview.widget.RecyclerView
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.show
import at.connyduck.pixelcat.databinding.ItemAccountSelectionBinding
@ -34,17 +35,17 @@ class AccountSelectionAdapter(
private val accounts: List<AccountEntity>,
private val onAccountSelected: (Long) -> 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 =
ItemAccountSelectionBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return AccountSelectionViewHolder(binding)
return BindingHolder(binding)
}
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
if (position == accounts.size) {
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.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import at.connyduck.pixelcat.R
import at.connyduck.pixelcat.components.util.BindingHolder
import at.connyduck.pixelcat.databinding.ItemComposeImageBinding
import at.connyduck.sparkbutton.helpers.Utils
import coil.api.load
@ -37,7 +37,7 @@ interface OnImageActionClickListener {
class ComposeImageAdapter(
private val listener: OnImageActionClickListener
) : ListAdapter<String, ComposeImageViewHolder>(
) : ListAdapter<String, BindingHolder<ItemComposeImageBinding>>(
object : DiffUtil.ItemCallback<String>() {
override fun areItemsTheSame(old: String, new: String): Boolean {
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 =
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 ->
@ -80,6 +80,3 @@ class ComposeImageAdapter(
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 androidx.recyclerview.widget.RecyclerView
import at.connyduck.pixelcat.R
import at.connyduck.pixelcat.components.util.BindingHolder
import at.connyduck.pixelcat.components.util.extension.visible
import at.connyduck.pixelcat.databinding.ItemProfileHeaderBinding
import at.connyduck.pixelcat.model.Account
@ -31,7 +32,7 @@ import coil.api.load
import coil.transform.RoundedCornersTransformation
import java.text.NumberFormat
class ProfileHeaderAdapter : RecyclerView.Adapter<ProfileHeaderViewHolder>() {
class ProfileHeaderAdapter : RecyclerView.Adapter<BindingHolder<ItemProfileHeaderBinding>>() {
private var account: Account? = null
private var isSelf: Boolean = false
@ -48,16 +49,15 @@ class ProfileHeaderAdapter : RecyclerView.Adapter<ProfileHeaderViewHolder>() {
notifyItemChanged(1, RELATIONSHIP_CHANGED)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProfileHeaderViewHolder {
val binding = ItemProfileHeaderBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ProfileHeaderViewHolder(binding)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemProfileHeaderBinding> {
return BindingHolder(ItemProfileHeaderBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
override fun onBindViewHolder(holder: ProfileHeaderViewHolder, position: Int) {
override fun onBindViewHolder(holder: BindingHolder<ItemProfileHeaderBinding>, position: Int) {
// 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)) {
account?.let {
holder.binding.profileName.text = it.username
@ -97,5 +97,3 @@ class ProfileHeaderAdapter : RecyclerView.Adapter<ProfileHeaderViewHolder>() {
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 androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
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.show
import at.connyduck.pixelcat.databinding.ItemProfileImageBinding
@ -34,7 +34,7 @@ import coil.api.load
class ProfileImageAdapter(
private val imageSizePx: Int
) : PagingDataAdapter<Status, ProfileImageViewHolder>(
) : PagingDataAdapter<Status, BindingHolder<ItemProfileImageBinding>>(
object : DiffUtil.ItemCallback<Status>() {
override fun areItemsTheSame(old: Status, new: Status): Boolean {
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)
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 ->
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.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import at.connyduck.pixelcat.components.util.BindingHolder
import at.connyduck.pixelcat.databinding.ItemTimelineImageBinding
import at.connyduck.pixelcat.model.Attachment
import coil.api.load
class TimelineImageAdapter : RecyclerView.Adapter<TimelineImageViewHolder>() {
class TimelineImageAdapter : RecyclerView.Adapter<BindingHolder<ItemTimelineImageBinding>>() {
var images: List<Attachment> = emptyList()
set(value) {
@ -34,17 +35,14 @@ class TimelineImageAdapter : RecyclerView.Adapter<TimelineImageViewHolder>() {
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TimelineImageViewHolder {
val binding = ItemTimelineImageBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return TimelineImageViewHolder(binding)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemTimelineImageBinding> {
return BindingHolder(ItemTimelineImageBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
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)
}
}
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.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
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.databinding.ItemStatusBinding
import at.connyduck.pixelcat.db.entitity.StatusEntity
@ -53,19 +53,19 @@ object TimelineDiffUtil : DiffUtil.ItemCallback<StatusEntity>() {
class TimelineListAdapter(
private val displayWidth: Int,
private val listener: TimeLineActionListener
) : PagingDataAdapter<StatusEntity, TimelineViewHolder>(TimelineDiffUtil) {
) : PagingDataAdapter<StatusEntity, BindingHolder<ItemStatusBinding>>(TimelineDiffUtil) {
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)
binding.postImages.adapter = TimelineImageAdapter()
binding.postIndicator.setViewPager(binding.postImages)
(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 ->
@ -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)