diff --git a/app/src/main/java/io/legado/app/base/adapter/CommonRecyclerAdapter.kt b/app/src/main/java/io/legado/app/base/adapter/CommonRecyclerAdapter.kt index a83b97374..41c709057 100644 --- a/app/src/main/java/io/legado/app/base/adapter/CommonRecyclerAdapter.kt +++ b/app/src/main/java/io/legado/app/base/adapter/CommonRecyclerAdapter.kt @@ -122,18 +122,7 @@ abstract class CommonRecyclerAdapter(protected val context: Context) : Rec } } - fun setItemsNoNotify(items: List?) { - synchronized(lock) { - if (this.items.isNotEmpty()) { - this.items.clear() - } - if (items != null) { - this.items.addAll(items) - } - } - } - - fun setItems(items: List?) { + fun setItems(items: List?, notify: Boolean = true) { synchronized(lock) { if (this.items.isNotEmpty()) { this.items.clear() diff --git a/app/src/main/java/io/legado/app/data/dao/BookDao.kt b/app/src/main/java/io/legado/app/data/dao/BookDao.kt index c74172c37..70091e69d 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookDao.kt @@ -1,7 +1,6 @@ package io.legado.app.data.dao import androidx.lifecycle.LiveData -import androidx.paging.DataSource import androidx.room.* import io.legado.app.constant.BookType import io.legado.app.data.entities.Book @@ -10,16 +9,16 @@ import io.legado.app.data.entities.Book interface BookDao { @Query("SELECT * FROM books order by durChapterTime desc") - fun observeAll(): DataSource.Factory + fun observeAll(): LiveData> @Query("SELECT * FROM books WHERE type = ${BookType.audio} order by durChapterTime desc") - fun observeAudio(): DataSource.Factory + fun observeAudio(): LiveData> @Query("SELECT * FROM books WHERE origin = '${BookType.local}' order by durChapterTime desc") - fun observeLocal(): DataSource.Factory + fun observeLocal(): LiveData> @Query("SELECT * FROM books WHERE `group` = :group") - fun observeByGroup(group: Int): DataSource.Factory + fun observeByGroup(group: Int): LiveData> @Query("SELECT bookUrl FROM books WHERE `group` = :group") fun observeUrlsByGroup(group: Int): LiveData> diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index db9405b0d..ec1359b63 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -147,7 +147,7 @@ class BookSourceActivity : VMBaseActivity(R.layout.activity search_view.queryHint = getString(R.string.search_book_source_num, it.size) val diffResult = DiffUtil .calculateDiff(DiffCallBack(adapter.getItems(), it)) - adapter.setItemsNoNotify(it) + adapter.setItems(it, false) diffResult.dispatchUpdatesTo(adapter) }) } diff --git a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt index 44483aa07..2a81ae398 100644 --- a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt @@ -44,7 +44,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio val diffResult = DiffUtil.calculateDiff(DiffCallBack(it.getItems(), books)) withContext(Main) { synchronized(this) { - it.setItemsNoNotify(books) + it.setItems(books, false) diffResult.dispatchUpdatesTo(it) } } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BooksAdapter.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BooksAdapter.kt index a6de9bad6..9b3ec6530 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BooksAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BooksAdapter.kt @@ -1,12 +1,9 @@ package io.legado.app.ui.main.bookshelf -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.paging.PagedListAdapter -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.RecyclerView +import android.content.Context import io.legado.app.R +import io.legado.app.base.adapter.ItemViewHolder +import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.constant.BookType import io.legado.app.data.entities.Book import io.legado.app.help.ImageLoader @@ -17,116 +14,66 @@ import kotlinx.android.synthetic.main.item_bookshelf_list.view.* import org.jetbrains.anko.sdk27.listeners.onClick import org.jetbrains.anko.sdk27.listeners.onLongClick -class BooksAdapter(private val callBack: CallBack) : - PagedListAdapter(DIFF_CALLBACK) { +class BooksAdapter(context: Context, private val callBack: CallBack) : + SimpleRecyclerAdapter(context, R.layout.item_bookshelf_list) { - companion object { - @JvmField - val DIFF_CALLBACK = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Book, newItem: Book): Boolean = - oldItem.bookUrl == newItem.bookUrl - - override fun areContentsTheSame(oldItem: Book, newItem: Book): Boolean = - oldItem.durChapterTitle == newItem.durChapterTitle - && oldItem.name == newItem.name - && oldItem.getDisplayCover() == newItem.getDisplayCover() - && oldItem.latestChapterTitle == newItem.latestChapterTitle - && oldItem.durChapterTitle == newItem.durChapterTitle - - override fun getChangePayload(oldItem: Book, newItem: Book): Any? { - if (oldItem.bookUrl != newItem.bookUrl) { - return null - } - return super.getChangePayload(oldItem, newItem) - } - } - } - - fun notification(bookUrl: String) { - for (i in 0 until itemCount) { - getItem(i)?.let { - if (it.bookUrl == bookUrl) { - notifyItemChanged(i, 5) - return - } - } - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { - return MyViewHolder( - LayoutInflater.from(parent.context) - .inflate(R.layout.item_bookshelf_list, parent, false) - ) - } - - override fun onBindViewHolder(holder: MyViewHolder, position: Int, payloads: MutableList) { + override fun convert(holder: ItemViewHolder, item: Book, payloads: MutableList) = + with(holder.itemView) { if (payloads.isEmpty()) { - super.onBindViewHolder(holder, position, payloads) - } else { - currentList?.get(position)?.let { - holder.bind(it, callBack, payloads[0]) - } - } - } - - override fun onBindViewHolder(holder: MyViewHolder, position: Int) { - currentList?.get(position)?.let { - holder.bind(it, callBack) - } - } - - class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) { - - init { - ATH.applyBackgroundTint(itemView) - } - - fun bind(book: Book, callBack: CallBack) = with(itemView) { - tv_name.text = book.name - tv_author.text = book.author - tv_read.text = book.durChapterTitle - tv_last.text = book.latestChapterTitle - book.getDisplayCover()?.let { + ATH.applyBackgroundTint(this) + tv_name.text = item.name + tv_author.text = item.author + tv_read.text = item.durChapterTitle + tv_last.text = item.latestChapterTitle + item.getDisplayCover()?.let { ImageLoader.load(context, it)//Glide自动识别http://和file:// .placeholder(R.drawable.image_cover_default) .error(R.drawable.image_cover_default) .centerCrop() .setAsDrawable(iv_cover) } - itemView.onClick { callBack.open(book) } - itemView.onLongClick { - callBack.openBookInfo(book) + onClick { callBack.open(item) } + onLongClick { + callBack.openBookInfo(item) true } - if (book.origin != BookType.local && callBack.isUpdate(book.bookUrl)) { - LogUtils.d(book.name, "loading") + if (item.origin != BookType.local && callBack.isUpdate(item.bookUrl)) { + LogUtils.d(item.name, "loading") bv_unread.invisible() rl_loading.show() } else { - LogUtils.d(book.name, "loadingHide") + LogUtils.d(item.name, "loadingHide") rl_loading.hide() - bv_unread.setBadgeCount(book.getUnreadChapterNum()) - bv_unread.setHighlight(book.lastCheckCount > 0) + bv_unread.setBadgeCount(item.getUnreadChapterNum()) + bv_unread.setHighlight(item.lastCheckCount > 0) } - } - - fun bind(book: Book, callBack: CallBack, payload: Any) = with(itemView) { - when (payload) { + } else { + when (payloads[0]) { 5 -> { - if (book.origin != BookType.local && callBack.isUpdate(book.bookUrl)) { - LogUtils.d(book.name, "loading") + if (item.origin != BookType.local && callBack.isUpdate(item.bookUrl)) { + LogUtils.d(item.name, "loading") bv_unread.invisible() rl_loading.show() } else { - LogUtils.d(book.name, "loadingHide") + LogUtils.d(item.name, "loadingHide") rl_loading.hide() - bv_unread.setBadgeCount(book.getUnreadChapterNum()) - bv_unread.setHighlight(book.lastCheckCount > 0) + bv_unread.setBadgeCount(item.getUnreadChapterNum()) + bv_unread.setHighlight(item.lastCheckCount > 0) } } } } + } + + fun notification(bookUrl: String) { + for (i in 0 until itemCount) { + getItem(i)?.let { + if (it.bookUrl == bookUrl) { + notifyItemChanged(i, 5) + return + } + } + } } interface CallBack { diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BooksFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BooksFragment.kt index e9b5051b2..9c20f526b 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BooksFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BooksFragment.kt @@ -5,8 +5,6 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.LiveData import androidx.lifecycle.Observer -import androidx.paging.LivePagedListBuilder -import androidx.paging.PagedList import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import io.legado.app.App @@ -44,7 +42,7 @@ class BooksFragment : VMBaseFragment(R.layout.fragment_books), private lateinit var activityViewModel: MainViewModel private lateinit var booksAdapter: BooksAdapter - private var bookshelfLiveData: LiveData>? = null + private var bookshelfLiveData: LiveData>? = null private var groupId = -1 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -73,36 +71,23 @@ class BooksFragment : VMBaseFragment(R.layout.fragment_books), this.setDrawable(it) } }) - booksAdapter = BooksAdapter(this) + booksAdapter = BooksAdapter(requireContext(), this) rv_bookshelf.adapter = booksAdapter } private fun upRecyclerData() { bookshelfLiveData?.removeObservers(this) - when (groupId) { - -1 -> { - bookshelfLiveData = - LivePagedListBuilder(App.db.bookDao().observeAll(), 100).build() - } - -2 -> { - bookshelfLiveData = - LivePagedListBuilder(App.db.bookDao().observeLocal(), 100).build() - } - -3 -> { - bookshelfLiveData = - LivePagedListBuilder(App.db.bookDao().observeAudio(), 100).build() - } - else -> { - bookshelfLiveData = - LivePagedListBuilder( - App.db.bookDao().observeByGroup(groupId), - 10 - ).build() - } + bookshelfLiveData = when (groupId) { + -1 -> App.db.bookDao().observeAll() + -2 -> App.db.bookDao().observeLocal() + -3 -> App.db.bookDao().observeAudio() + else -> App.db.bookDao().observeByGroup(groupId) } bookshelfLiveData?.observe( this, - Observer { pageList -> booksAdapter.submitList(pageList) }) + Observer { + booksAdapter.setItems(it) + }) } override fun open(book: Book) { diff --git a/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleActivity.kt b/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleActivity.kt index ad7d9e28a..e335bfb1b 100644 --- a/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleActivity.kt @@ -104,7 +104,7 @@ class ReplaceRuleActivity : VMBaseActivity(R.layout.activi } replaceRuleLiveData?.observe(this, Observer { val diffResult = DiffUtil.calculateDiff(DiffCallBack(adapter.getItems(), it)) - adapter.setItemsNoNotify(it) + adapter.setItems(it, false) diffResult.dispatchUpdatesTo(adapter) }) } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt index e34a56418..dce6b21cf 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt @@ -152,7 +152,7 @@ class RssSourceActivity : VMBaseActivity(R.layout.activity_r sourceLiveData?.observe(this, Observer { val diffResult = DiffUtil .calculateDiff(DiffCallBack(adapter.getItems(), it)) - adapter.setItemsNoNotify(it) + adapter.setItems(it, false) diffResult.dispatchUpdatesTo(adapter) }) }