introduce generic BindingHolder as replacement for individual ViewHolders
This commit is contained in:
parent
f35734ce74
commit
47afa8818f
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue