Horis 1 год назад
Родитель
Сommit
b95d4b4b27

+ 1 - 1
app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksFragment.kt

@@ -204,7 +204,7 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books),
 
     private fun startLastUpdateTimeJob() {
         upLastUpdateTimeJob?.cancel()
-        if (!AppConfig.showLastUpdateTime) {
+        if (!AppConfig.showLastUpdateTime || bookshelfLayout != 0) {
             return
         }
         upLastUpdateTimeJob = lifecycleScope.launch {

+ 89 - 40
app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BaseBooksAdapter.kt

@@ -1,60 +1,96 @@
 package io.legado.app.ui.main.bookshelf.style2
 
 import android.content.Context
+import android.view.LayoutInflater
 import androidx.core.os.bundleOf
+import androidx.recyclerview.widget.AsyncListDiffer
 import androidx.recyclerview.widget.DiffUtil
 import androidx.recyclerview.widget.RecyclerView
 import io.legado.app.data.entities.Book
+import io.legado.app.data.entities.BookGroup
 
 abstract class BaseBooksAdapter<VH : RecyclerView.ViewHolder>(
     val context: Context,
     val callBack: CallBack
 ) : RecyclerView.Adapter<VH>() {
 
-    val diffItemCallback = object : DiffUtil.ItemCallback<Book>() {
+    protected val inflater: LayoutInflater = LayoutInflater.from(context)
 
-        override fun areItemsTheSame(oldItem: Book, newItem: Book): Boolean {
-            return oldItem.name == newItem.name
-                    && oldItem.author == newItem.author
+    private val diffItemCallback = object : DiffUtil.ItemCallback<Any>() {
+
+        override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean {
+            return when {
+                oldItem is Book && newItem is Book -> {
+                    oldItem.name == newItem.name
+                            && oldItem.author == newItem.author
+                }
+
+                oldItem is BookGroup && newItem is BookGroup -> {
+                    oldItem.groupId == newItem.groupId
+                }
+
+                else -> false
+            }
         }
 
-        override fun areContentsTheSame(oldItem: Book, newItem: Book): Boolean {
+        override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean {
             return when {
-                oldItem.durChapterTime != newItem.durChapterTime -> false
-                oldItem.name != newItem.name -> false
-                oldItem.author != newItem.author -> false
-                oldItem.durChapterTitle != newItem.durChapterTitle -> false
-                oldItem.latestChapterTitle != newItem.latestChapterTitle -> false
-                oldItem.lastCheckCount != newItem.lastCheckCount -> false
-                oldItem.getDisplayCover() != newItem.getDisplayCover() -> false
-                oldItem.getUnreadChapterNum() != newItem.getUnreadChapterNum() -> false
-                else -> true
+                oldItem is Book && newItem is Book -> {
+                    oldItem.durChapterTime == newItem.durChapterTime &&
+                            oldItem.name == newItem.name &&
+                            oldItem.author == newItem.author &&
+                            oldItem.durChapterTitle == newItem.durChapterTitle &&
+                            oldItem.latestChapterTitle == newItem.latestChapterTitle &&
+                            oldItem.lastCheckCount == newItem.lastCheckCount &&
+                            oldItem.getDisplayCover() == newItem.getDisplayCover() &&
+                            oldItem.getUnreadChapterNum() == newItem.getUnreadChapterNum()
+                }
+
+                oldItem is BookGroup && newItem is BookGroup -> {
+                    oldItem.groupName == newItem.groupName &&
+                            oldItem.cover == newItem.cover
+                }
+
+                else -> false
             }
         }
 
-        override fun getChangePayload(oldItem: Book, newItem: Book): Any? {
+        override fun getChangePayload(oldItem: Any, newItem: Any): Any? {
             val bundle = bundleOf()
-            if (oldItem.name != newItem.name) {
-                bundle.putString("name", newItem.name)
-            }
-            if (oldItem.author != newItem.author) {
-                bundle.putString("author", newItem.author)
-            }
-            if (oldItem.durChapterTitle != newItem.durChapterTitle) {
-                bundle.putString("dur", newItem.durChapterTitle)
-            }
-            if (oldItem.latestChapterTitle != newItem.latestChapterTitle) {
-                bundle.putString("last", newItem.latestChapterTitle)
-            }
-            if (oldItem.getDisplayCover() != newItem.getDisplayCover()) {
-                bundle.putString("cover", newItem.getDisplayCover())
-            }
-            if (oldItem.lastCheckCount != newItem.lastCheckCount
-                || oldItem.durChapterTime != newItem.durChapterTime
-                || oldItem.getUnreadChapterNum() != newItem.getUnreadChapterNum()
-                || oldItem.lastCheckCount != newItem.lastCheckCount
-            ) {
-                bundle.putBoolean("refresh", true)
+            when {
+                oldItem is Book && newItem is Book -> {
+                    if (oldItem.name != newItem.name) {
+                        bundle.putString("name", newItem.name)
+                    }
+                    if (oldItem.author != newItem.author) {
+                        bundle.putString("author", newItem.author)
+                    }
+                    if (oldItem.durChapterTitle != newItem.durChapterTitle) {
+                        bundle.putString("dur", newItem.durChapterTitle)
+                    }
+                    if (oldItem.latestChapterTitle != newItem.latestChapterTitle) {
+                        bundle.putString("last", newItem.latestChapterTitle)
+                    }
+                    if (oldItem.getDisplayCover() != newItem.getDisplayCover()) {
+                        bundle.putString("cover", newItem.getDisplayCover())
+                    }
+                    if (oldItem.lastCheckCount != newItem.lastCheckCount
+                        || oldItem.durChapterTime != newItem.durChapterTime
+                        || oldItem.getUnreadChapterNum() != newItem.getUnreadChapterNum()
+                        || oldItem.lastCheckCount != newItem.lastCheckCount
+                    ) {
+                        bundle.putBoolean("refresh", true)
+                    }
+                }
+
+                oldItem is BookGroup && newItem is BookGroup -> {
+                    if (oldItem.groupName != newItem.groupName) {
+                        bundle.putString("groupName", newItem.groupName)
+                    }
+                    if (oldItem.cover != newItem.cover) {
+                        bundle.putString("cover", newItem.cover)
+                    }
+                }
             }
             if (bundle.isEmpty) return null
             return bundle
@@ -62,9 +98,17 @@ abstract class BaseBooksAdapter<VH : RecyclerView.ViewHolder>(
 
     }
 
+    private val asyncListDiffer by lazy {
+        AsyncListDiffer(this, diffItemCallback)
+    }
+
+    fun updateItems() {
+        asyncListDiffer.submitList(callBack.getItems())
+    }
+
     fun notification(bookUrl: String) {
         for (i in 0 until itemCount) {
-            callBack.getItem(i).let {
+            getItem(i).let {
                 if (it is Book && it.bookUrl == bookUrl) {
                     notifyItemChanged(i, bundleOf(Pair("refresh", null)))
                     return
@@ -73,21 +117,26 @@ abstract class BaseBooksAdapter<VH : RecyclerView.ViewHolder>(
         }
     }
 
+    fun getItems() = asyncListDiffer.currentList
+
+    fun getItem(position: Int) = getItems().getOrNull(position)
+
     override fun getItemCount(): Int {
-        return callBack.getItemCount()
+        return getItems().size
     }
 
     override fun getItemViewType(position: Int): Int {
         return callBack.getItemType(position)
     }
 
+    final override fun onBindViewHolder(holder: VH, position: Int) {}
+
 
     interface CallBack {
         fun onItemClick(position: Int)
         fun onItemLongClick(position: Int)
         fun isUpdate(bookUrl: String): Boolean
-        fun getItemCount(): Int
         fun getItemType(position: Int): Int
-        fun getItem(position: Int): Any?
+        fun getItems(): List<Any>
     }
 }

+ 42 - 34
app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BooksAdapterGrid.kt

@@ -2,7 +2,6 @@ package io.legado.app.ui.main.bookshelf.style2
 
 import android.content.Context
 import android.os.Bundle
-import android.view.LayoutInflater
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
 import io.legado.app.data.entities.Book
@@ -23,12 +22,8 @@ class BooksAdapterGrid(context: Context, callBack: CallBack) :
         viewType: Int
     ): RecyclerView.ViewHolder {
         return when (viewType) {
-            1 -> GroupViewHolder(
-                ItemBookshelfGridGroupBinding.inflate(LayoutInflater.from(context), parent, false)
-            )
-            else -> BookViewHolder(
-                ItemBookshelfGridBinding.inflate(LayoutInflater.from(context), parent, false)
-            )
+            1 -> GroupViewHolder(ItemBookshelfGridGroupBinding.inflate(inflater, parent, false))
+            else -> BookViewHolder(ItemBookshelfGridBinding.inflate(inflater, parent, false))
         }
     }
 
@@ -37,25 +32,13 @@ class BooksAdapterGrid(context: Context, callBack: CallBack) :
         position: Int,
         payloads: MutableList<Any>
     ) {
-        val bundle = payloads.getOrNull(0) as? Bundle
-        when {
-            bundle == null -> super.onBindViewHolder(holder, position, payloads)
-            holder is BookViewHolder -> (callBack.getItem(position) as? Book)?.let {
-                holder.onBind(it, bundle)
-            }
-            holder is GroupViewHolder -> (callBack.getItem(position) as? BookGroup)?.let {
-                holder.onBind(it, bundle)
-            }
-        }
-    }
-
-    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
         when (holder) {
-            is BookViewHolder -> (callBack.getItem(position) as? Book)?.let {
-                holder.onBind(it, position)
+            is BookViewHolder -> (getItem(position) as? Book)?.let {
+                holder.onBind(it, position, payloads)
             }
-            is GroupViewHolder -> (callBack.getItem(position) as? BookGroup)?.let {
-                holder.onBind(it, position)
+
+            is GroupViewHolder -> (getItem(position) as? BookGroup)?.let {
+                holder.onBind(it, position, payloads)
             }
         }
     }
@@ -63,7 +46,7 @@ class BooksAdapterGrid(context: Context, callBack: CallBack) :
     inner class BookViewHolder(val binding: ItemBookshelfGridBinding) :
         RecyclerView.ViewHolder(binding.root) {
 
-        fun onBind(item: Book, position: Int) = binding.run{
+        fun onBind(item: Book, position: Int) = binding.run {
             tvName.text = item.name
             ivCover.load(item.getDisplayCover(), item.name, item.author, false, item.origin)
             upRefresh(this, item)
@@ -75,12 +58,26 @@ class BooksAdapterGrid(context: Context, callBack: CallBack) :
             }
         }
 
-        fun onBind(item: Book, bundle: Bundle) = binding.run {
-            bundle.keySet().forEach {
-                when (it) {
-                    "name" -> tvName.text = item.name
-                    "cover" -> ivCover.load(item.getDisplayCover(), item.name, item.author, false, item.origin)
-                    "refresh" -> upRefresh(this, item)
+        fun onBind(item: Book, position: Int, payloads: MutableList<Any>) = binding.run {
+            if (payloads.isEmpty()) {
+                onBind(item, position)
+            } else {
+                for (i in payloads.indices) {
+                    val bundle = payloads[i] as Bundle
+                    bundle.keySet().forEach {
+                        when (it) {
+                            "name" -> tvName.text = item.name
+                            "cover" -> ivCover.load(
+                                item.getDisplayCover(),
+                                item.name,
+                                item.author,
+                                false,
+                                item.origin
+                            )
+
+                            "refresh" -> upRefresh(this, item)
+                        }
+                    }
                 }
             }
         }
@@ -116,9 +113,20 @@ class BooksAdapterGrid(context: Context, callBack: CallBack) :
             }
         }
 
-        fun onBind(item: BookGroup, bundle: Bundle) = binding.run {
-            tvName.text = item.groupName
-            ivCover.load(item.cover)
+        fun onBind(item: BookGroup, position: Int, payloads: MutableList<Any>) = binding.run {
+            if (payloads.isEmpty()) {
+                onBind(item, position)
+            } else {
+                for (i in payloads.indices) {
+                    val bundle = payloads[i] as Bundle
+                    bundle.keySet().forEach {
+                        when (it) {
+                            "groupName" -> tvName.text = item.groupName
+                            "cover" -> ivCover.load(item.cover)
+                        }
+                    }
+                }
+            }
         }
 
     }

+ 46 - 38
app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BooksAdapterList.kt

@@ -2,7 +2,6 @@ package io.legado.app.ui.main.bookshelf.style2
 
 import android.content.Context
 import android.os.Bundle
-import android.view.LayoutInflater
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
 import io.legado.app.data.entities.Book
@@ -22,12 +21,8 @@ class BooksAdapterList(context: Context, callBack: CallBack) :
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
         return when (viewType) {
-            1 -> GroupViewHolder(
-                ItemBookshelfListGroupBinding.inflate(LayoutInflater.from(context), parent, false)
-            )
-            else -> BookViewHolder(
-                ItemBookshelfListBinding.inflate(LayoutInflater.from(context), parent, false)
-            )
+            1 -> GroupViewHolder(ItemBookshelfListGroupBinding.inflate(inflater, parent, false))
+            else -> BookViewHolder(ItemBookshelfListBinding.inflate(inflater, parent, false))
         }
     }
 
@@ -36,25 +31,13 @@ class BooksAdapterList(context: Context, callBack: CallBack) :
         position: Int,
         payloads: MutableList<Any>
     ) {
-        val bundle = payloads.getOrNull(0) as? Bundle
-        when {
-            bundle == null -> super.onBindViewHolder(holder, position, payloads)
-            holder is BookViewHolder -> (callBack.getItem(position) as? Book)?.let {
-                holder.onBind(it, bundle)
-            }
-            holder is GroupViewHolder -> (callBack.getItem(position) as? BookGroup)?.let {
-                holder.onBind(it, bundle)
-            }
-        }
-    }
-
-    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
         when (holder) {
-            is BookViewHolder -> (callBack.getItem(position) as? Book)?.let {
-                holder.onBind(it, position)
+            is BookViewHolder -> (getItem(position) as? Book)?.let {
+                holder.onBind(it, position, payloads)
             }
-            is GroupViewHolder -> (callBack.getItem(position) as? BookGroup)?.let {
-                holder.onBind(it, position)
+
+            is GroupViewHolder -> (getItem(position) as? BookGroup)?.let {
+                holder.onBind(it, position, payloads)
             }
         }
     }
@@ -62,7 +45,7 @@ class BooksAdapterList(context: Context, callBack: CallBack) :
     inner class BookViewHolder(val binding: ItemBookshelfListBinding) :
         RecyclerView.ViewHolder(binding.root) {
 
-        fun onBind(item: Book, position: Int) = binding.run{
+        fun onBind(item: Book, position: Int) = binding.run {
             tvName.text = item.name
             tvAuthor.text = item.author
             tvRead.text = item.durChapterTitle
@@ -81,15 +64,29 @@ class BooksAdapterList(context: Context, callBack: CallBack) :
             }
         }
 
-        fun onBind(item: Book, bundle: Bundle) = binding.run {
-            tvRead.text = item.durChapterTitle
-            tvLast.text = item.latestChapterTitle
-            bundle.keySet().forEach {
-                when (it) {
-                    "name" -> tvName.text = item.name
-                    "author" -> tvAuthor.text = item.author
-                    "cover" -> ivCover.load(item.getDisplayCover(), item.name, item.author, false, item.origin)
-                    "refresh" -> upRefresh(this, item)
+        fun onBind(item: Book, position: Int, payloads: MutableList<Any>) = binding.run {
+            if (payloads.isEmpty()) {
+                onBind(item, position)
+            } else {
+                for (i in payloads.indices) {
+                    val bundle = payloads[i] as Bundle
+                    bundle.keySet().forEach {
+                        when (it) {
+                            "name" -> tvName.text = item.name
+                            "author" -> tvAuthor.text = item.author
+                            "dur" -> tvRead.text = item.durChapterTitle
+                            "last" -> tvLast.text = item.latestChapterTitle
+                            "cover" -> ivCover.load(
+                                item.getDisplayCover(),
+                                item.name,
+                                item.author,
+                                false,
+                                item.origin
+                            )
+
+                            "refresh" -> upRefresh(this, item)
+                        }
+                    }
                 }
             }
         }
@@ -114,7 +111,7 @@ class BooksAdapterList(context: Context, callBack: CallBack) :
     inner class GroupViewHolder(val binding: ItemBookshelfListGroupBinding) :
         RecyclerView.ViewHolder(binding.root) {
 
-        fun onBind(item: BookGroup, position: Int) = binding.run{
+        fun onBind(item: BookGroup, position: Int) = binding.run {
             tvName.text = item.groupName
             ivCover.load(item.cover)
             flHasNew.gone()
@@ -132,9 +129,20 @@ class BooksAdapterList(context: Context, callBack: CallBack) :
             }
         }
 
-        fun onBind(item: BookGroup, bundle: Bundle) = binding.run {
-            tvName.text = item.groupName
-            ivCover.load(item.cover)
+        fun onBind(item: BookGroup, position: Int, payloads: MutableList<Any>) = binding.run {
+            if (payloads.isEmpty()) {
+                onBind(item, position)
+            } else {
+                for (i in payloads.indices) {
+                    val bundle = payloads[i] as Bundle
+                    bundle.keySet().forEach {
+                        when (it) {
+                            "groupName" -> tvName.text = item.groupName
+                            "cover" -> ivCover.load(item.cover)
+                        }
+                    }
+                }
+            }
         }
 
     }

+ 26 - 18
app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BookshelfFragment2.kt

@@ -5,6 +5,7 @@ import android.os.Bundle
 import android.view.View
 import androidx.appcompat.widget.SearchView
 import androidx.core.view.isGone
+import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.LinearLayoutManager
@@ -12,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView
 import io.legado.app.R
 import io.legado.app.constant.AppLog
 import io.legado.app.constant.EventBus
+import io.legado.app.data.AppDatabase
 import io.legado.app.data.appDb
 import io.legado.app.data.entities.Book
 import io.legado.app.data.entities.BookGroup
@@ -28,6 +30,7 @@ import io.legado.app.ui.book.read.ReadBookActivity
 import io.legado.app.ui.book.search.SearchActivity
 import io.legado.app.ui.main.bookshelf.BaseBookshelfFragment
 import io.legado.app.utils.cnCompare
+import io.legado.app.utils.flowWithLifecycleAndDatabaseChangeFirst
 import io.legado.app.utils.observeEvent
 import io.legado.app.utils.setEdgeEffectColor
 import io.legado.app.utils.showDialogFragment
@@ -70,6 +73,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
     private var booksFlowJob: Job? = null
     override var groupId = BookGroup.IdRoot
     override var books: List<Book> = emptyList()
+    private var enableRefresh = true
 
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
         setSupportToolbar(binding.titleBar.toolbar)
@@ -90,6 +94,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
         } else {
             binding.rvBookshelf.layoutManager = GridLayoutManager(context, bookshelfLayout + 2)
         }
+        binding.rvBookshelf.itemAnimator = null
         binding.rvBookshelf.adapter = booksAdapter
         booksAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
             override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
@@ -110,12 +115,12 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
         })
     }
 
-    @SuppressLint("NotifyDataSetChanged")
     override fun upGroup(data: List<BookGroup>) {
         if (data != bookGroups) {
             bookGroups = data
-            booksAdapter.notifyDataSetChanged()
+            booksAdapter.updateItems()
             binding.tvEmptyMsg.isGone = getItemCount() > 0
+            binding.refreshLayout.isEnabled = enableRefresh && getItemCount() > 0
         }
     }
 
@@ -123,12 +128,12 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
         initBooksData()
     }
 
-    @SuppressLint("NotifyDataSetChanged")
     private fun initBooksData() {
-        if (groupId == -100L) {
+        if (groupId == BookGroup.IdRoot) {
             if (isAdded) {
                 binding.titleBar.title = getString(R.string.bookshelf)
                 binding.refreshLayout.isEnabled = true
+                enableRefresh = true
             }
         } else {
             bookGroups.firstOrNull {
@@ -136,6 +141,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
             }?.let {
                 binding.titleBar.title = "${getString(R.string.bookshelf)}(${it.groupName})"
                 binding.refreshLayout.isEnabled = it.enableRefresh
+                enableRefresh = it.enableRefresh
             }
         }
         booksFlowJob?.cancel()
@@ -163,20 +169,25 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
                         it.durChapterTime
                     }
                 }
-            }.flowOn(Dispatchers.Default).catch {
+            }.flowWithLifecycleAndDatabaseChangeFirst(
+                viewLifecycleOwner.lifecycle,
+                Lifecycle.State.RESUMED,
+                AppDatabase.BOOK_TABLE_NAME
+            ).catch {
                 AppLog.put("书架更新出错", it)
-            }.conflate().collect { list ->
+            }.conflate().flowOn(Dispatchers.Default).collect { list ->
                 books = list
-                booksAdapter.notifyDataSetChanged()
+                booksAdapter.updateItems()
                 binding.tvEmptyMsg.isGone = getItemCount() > 0
+                binding.refreshLayout.isEnabled = enableRefresh && getItemCount() > 0
                 delay(100)
             }
         }
     }
 
     fun back(): Boolean {
-        if (groupId != -100L) {
-            groupId = -100L
+        if (groupId != BookGroup.IdRoot) {
+            groupId = BookGroup.IdRoot
             initBooksData()
             return true
         }
@@ -201,7 +212,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
     }
 
     override fun onItemClick(position: Int) {
-        when (val item = getItem(position)) {
+        when (val item = booksAdapter.getItem(position)) {
             is Book -> when {
                 item.isAudio ->
                     startActivity<AudioPlayActivity> {
@@ -221,7 +232,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
     }
 
     override fun onItemLongClick(position: Int) {
-        when (val item = getItem(position)) {
+        when (val item = booksAdapter.getItem(position)) {
             is Book -> startActivity<BookInfoActivity> {
                 putExtra("name", item.name)
                 putExtra("author", item.author)
@@ -235,7 +246,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
         return activityViewModel.isUpdate(bookUrl)
     }
 
-    override fun getItemCount(): Int {
+    fun getItemCount(): Int {
         return if (groupId == BookGroup.IdRoot) {
             bookGroups.size + books.size
         } else {
@@ -253,14 +264,11 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
         return 0
     }
 
-    override fun getItem(position: Int): Any? {
+    override fun getItems(): List<Any> {
         if (groupId != BookGroup.IdRoot) {
-            return books.getOrNull(position)
-        }
-        if (position < bookGroups.size) {
-            return bookGroups[position]
+            return books
         }
-        return books.getOrNull(position - bookGroups.size)
+        return bookGroups + books
     }
 
     @SuppressLint("NotifyDataSetChanged")