Fix recycleview article positions (#163)
Reviewed-on: Louvorg/ReaderForSelfoss-multiplatform#163 Reviewed-by: Amine Bouabdallaoui <amineb@hidden.hidden>
This commit is contained in:
commit
236e1cca90
@ -13,7 +13,11 @@ import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.appcompat.widget.SearchView
|
||||
import androidx.core.view.doOnNextLayout
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.*
|
||||
import androidx.recyclerview.widget.DividerItemDecoration
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.ItemTouchHelper
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager
|
||||
import androidx.work.Constraints
|
||||
import androidx.work.ExistingPeriodicWorkPolicy
|
||||
import androidx.work.PeriodicWorkRequestBuilder
|
||||
@ -58,7 +62,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
private lateinit var recyclerViewScrollListener: RecyclerView.OnScrollListener
|
||||
private lateinit var binding: ActivityHomeBinding
|
||||
|
||||
private var recyclerAdapter: RecyclerView.Adapter<*>? = null
|
||||
private var recyclerAdapter: ItemsAdapter<out RecyclerView.ViewHolder>? = null
|
||||
|
||||
private var fromTabShortcut: Boolean = false
|
||||
|
||||
@ -498,7 +502,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
binding.recyclerView.adapter = recyclerAdapter
|
||||
} else {
|
||||
(recyclerAdapter as ItemsAdapter<*>).updateAllItems(items)
|
||||
recyclerAdapter!!.updateAllItems(items)
|
||||
}
|
||||
|
||||
reloadBadges()
|
||||
|
@ -1,7 +1,6 @@
|
||||
package bou.amine.apps.readerforselfossv2.android.adapters
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
@ -14,7 +13,6 @@ import bou.amine.apps.readerforselfossv2.android.utils.LinkOnTouchListener
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.bitmapCenterCrop
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.circularDrawable
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.openInBrowserAsNewTask
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.openItemUrl
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.shareLink
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
@ -32,11 +30,10 @@ import org.kodein.di.instance
|
||||
|
||||
class ItemCardAdapter(
|
||||
override val app: Activity,
|
||||
override var items: ArrayList<SelfossModel.Item>,
|
||||
override val updateItems: (ArrayList<SelfossModel.Item>) -> Unit,
|
||||
override val items: ArrayList<SelfossModel.Item>,
|
||||
override val updateHomeItems: (ArrayList<SelfossModel.Item>) -> Unit,
|
||||
) : ItemsAdapter<ItemCardAdapter.ViewHolder>() {
|
||||
private lateinit var binding: CardItemBinding
|
||||
private val c: Context = app.baseContext
|
||||
override lateinit var binding: CardItemBinding
|
||||
private val imageMaxHeight: Int =
|
||||
c.resources.getDimension(R.dimen.card_image_max_height).toInt()
|
||||
|
||||
@ -52,8 +49,8 @@ class ItemCardAdapter(
|
||||
return ViewHolder(binding)
|
||||
}
|
||||
|
||||
private fun handleClickListeners(position: Int) {
|
||||
binding.favButton.setOnClickListener {
|
||||
private fun handleClickListeners(holderBinding: CardItemBinding, position: Int) {
|
||||
holderBinding.favButton.setOnClickListener {
|
||||
val item = items[position]
|
||||
if (item.starred) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
@ -78,27 +75,15 @@ class ItemCardAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleLinkOpening(position: Int) {
|
||||
binding.root.setOnClickListener {
|
||||
repository.setReaderItems(items)
|
||||
c.openItemUrl(
|
||||
position,
|
||||
items[position].getLinkDecoded(),
|
||||
appSettingsService.isArticleViewerEnabled(),
|
||||
app,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(
|
||||
holder: ViewHolder,
|
||||
position: Int,
|
||||
) {
|
||||
with(holder) {
|
||||
val itm = items[holder.bindingAdapterPosition]
|
||||
val itm = items[position]
|
||||
|
||||
handleClickListeners(holder.bindingAdapterPosition)
|
||||
handleLinkOpening(holder.bindingAdapterPosition)
|
||||
handleClickListeners(binding, position)
|
||||
handleLinkOpening(binding, position)
|
||||
|
||||
binding.favButton.isSelected = itm.starred
|
||||
if (appSettingsService.getPublicAccess()) {
|
||||
@ -140,9 +125,5 @@ class ItemCardAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return items.size
|
||||
}
|
||||
|
||||
inner class ViewHolder(val binding: CardItemBinding) : RecyclerView.ViewHolder(binding.root)
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
package bou.amine.apps.readerforselfossv2.android.adapters
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
@ -10,7 +9,6 @@ import bou.amine.apps.readerforselfossv2.android.databinding.ListItemBinding
|
||||
import bou.amine.apps.readerforselfossv2.android.sendSilentlyWithAcraWithName
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.LinkOnTouchListener
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.circularDrawable
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.openItemUrl
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
@ -23,11 +21,10 @@ import org.kodein.di.instance
|
||||
|
||||
class ItemListAdapter(
|
||||
override val app: Activity,
|
||||
override var items: ArrayList<SelfossModel.Item>,
|
||||
override val updateItems: (ArrayList<SelfossModel.Item>) -> Unit,
|
||||
override val items: ArrayList<SelfossModel.Item>,
|
||||
override val updateHomeItems: (ArrayList<SelfossModel.Item>) -> Unit,
|
||||
) : ItemsAdapter<ItemListAdapter.ViewHolder>() {
|
||||
private lateinit var binding: ListItemBinding
|
||||
private val c: Context = app.baseContext
|
||||
override lateinit var binding: ListItemBinding
|
||||
|
||||
override val di: DI by closestDI(app)
|
||||
override val repository: Repository by instance()
|
||||
@ -46,17 +43,9 @@ class ItemListAdapter(
|
||||
position: Int,
|
||||
) {
|
||||
with(holder) {
|
||||
val itm = items[holder.bindingAdapterPosition]
|
||||
val itm = items[position]
|
||||
|
||||
binding.root.setOnClickListener {
|
||||
repository.setReaderItems(items)
|
||||
c.openItemUrl(
|
||||
holder.bindingAdapterPosition,
|
||||
items[holder.bindingAdapterPosition].getLinkDecoded(),
|
||||
appSettingsService.isArticleViewerEnabled(),
|
||||
app,
|
||||
)
|
||||
}
|
||||
handleLinkOpening(binding, position)
|
||||
|
||||
binding.title.text = itm.title.getHtmlDecoded()
|
||||
|
||||
@ -83,7 +72,5 @@ class ItemListAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = items.size
|
||||
|
||||
inner class ViewHolder(val binding: ListItemBinding) : RecyclerView.ViewHolder(binding.root)
|
||||
}
|
||||
|
@ -1,10 +1,13 @@
|
||||
package bou.amine.apps.readerforselfossv2.android.adapters
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.widget.TextView
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import bou.amine.apps.readerforselfossv2.android.R
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.openItemUrl
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
@ -16,16 +19,20 @@ import kotlinx.coroutines.launch
|
||||
import org.kodein.di.DIAware
|
||||
|
||||
abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapter<VH>(), DIAware {
|
||||
abstract var items: ArrayList<SelfossModel.Item>
|
||||
abstract val items: ArrayList<SelfossModel.Item>
|
||||
abstract val repository: Repository
|
||||
abstract val binding: ViewBinding
|
||||
abstract val appSettingsService: AppSettingsService
|
||||
abstract val app: Activity
|
||||
abstract val updateItems: (ArrayList<SelfossModel.Item>) -> Unit
|
||||
abstract val updateHomeItems: (ArrayList<SelfossModel.Item>) -> Unit
|
||||
|
||||
protected val c: Context get() = app.baseContext
|
||||
|
||||
fun updateAllItems(items: ArrayList<SelfossModel.Item>) {
|
||||
this.items = items
|
||||
this.items.clear()
|
||||
this.items.addAll(items)
|
||||
updateHomeItems(items)
|
||||
notifyDataSetChanged()
|
||||
updateItems(this.items)
|
||||
}
|
||||
|
||||
private fun unmarkSnackbar(
|
||||
@ -70,6 +77,18 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte
|
||||
s.show()
|
||||
}
|
||||
|
||||
protected fun handleLinkOpening(holderBinding: ViewBinding, position: Int) {
|
||||
holderBinding.root.setOnClickListener {
|
||||
repository.setReaderItems(items)
|
||||
c.openItemUrl(
|
||||
position,
|
||||
items[position].getLinkDecoded(),
|
||||
appSettingsService.isArticleViewerEnabled(),
|
||||
app,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun handleItemAtIndex(position: Int) {
|
||||
if (items[position].unread) {
|
||||
readItemAtIndex(items[position], position)
|
||||
@ -90,7 +109,7 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte
|
||||
items.remove(item)
|
||||
notifyItemRemoved(position)
|
||||
notifyItemRangeChanged(position, itemCount)
|
||||
updateItems(items)
|
||||
updateHomeItems(items)
|
||||
} else {
|
||||
notifyItemChanged(position)
|
||||
}
|
||||
@ -119,13 +138,15 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte
|
||||
) {
|
||||
items.add(position, item)
|
||||
notifyItemInserted(position)
|
||||
updateItems(items)
|
||||
updateHomeItems(items)
|
||||
}
|
||||
|
||||
fun addItemsAtEnd(newItems: List<SelfossModel.Item>) {
|
||||
val oldSize = items.size
|
||||
items.addAll(newItems)
|
||||
notifyItemRangeInserted(oldSize, newItems.size)
|
||||
updateItems(items)
|
||||
updateHomeItems(items)
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = items.size
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user