pull/37/head
kunfei 6 years ago
parent fff0788b8d
commit 091d2508fd
  1. 13
      app/src/main/java/io/legado/app/base/adapter/CommonRecyclerAdapter.kt
  2. 9
      app/src/main/java/io/legado/app/data/dao/BookDao.kt
  3. 2
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt
  4. 2
      app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt
  5. 131
      app/src/main/java/io/legado/app/ui/main/bookshelf/BooksAdapter.kt
  6. 35
      app/src/main/java/io/legado/app/ui/main/bookshelf/BooksFragment.kt
  7. 2
      app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleActivity.kt
  8. 2
      app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt

@ -122,18 +122,7 @@ abstract class CommonRecyclerAdapter<ITEM>(protected val context: Context) : Rec
} }
} }
fun setItemsNoNotify(items: List<ITEM>?) { fun setItems(items: List<ITEM>?, notify: Boolean = true) {
synchronized(lock) {
if (this.items.isNotEmpty()) {
this.items.clear()
}
if (items != null) {
this.items.addAll(items)
}
}
}
fun setItems(items: List<ITEM>?) {
synchronized(lock) { synchronized(lock) {
if (this.items.isNotEmpty()) { if (this.items.isNotEmpty()) {
this.items.clear() this.items.clear()

@ -1,7 +1,6 @@
package io.legado.app.data.dao package io.legado.app.data.dao
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.paging.DataSource
import androidx.room.* import androidx.room.*
import io.legado.app.constant.BookType import io.legado.app.constant.BookType
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
@ -10,16 +9,16 @@ import io.legado.app.data.entities.Book
interface BookDao { interface BookDao {
@Query("SELECT * FROM books order by durChapterTime desc") @Query("SELECT * FROM books order by durChapterTime desc")
fun observeAll(): DataSource.Factory<Int, Book> fun observeAll(): LiveData<List<Book>>
@Query("SELECT * FROM books WHERE type = ${BookType.audio} order by durChapterTime desc") @Query("SELECT * FROM books WHERE type = ${BookType.audio} order by durChapterTime desc")
fun observeAudio(): DataSource.Factory<Int, Book> fun observeAudio(): LiveData<List<Book>>
@Query("SELECT * FROM books WHERE origin = '${BookType.local}' order by durChapterTime desc") @Query("SELECT * FROM books WHERE origin = '${BookType.local}' order by durChapterTime desc")
fun observeLocal(): DataSource.Factory<Int, Book> fun observeLocal(): LiveData<List<Book>>
@Query("SELECT * FROM books WHERE `group` = :group") @Query("SELECT * FROM books WHERE `group` = :group")
fun observeByGroup(group: Int): DataSource.Factory<Int, Book> fun observeByGroup(group: Int): LiveData<List<Book>>
@Query("SELECT bookUrl FROM books WHERE `group` = :group") @Query("SELECT bookUrl FROM books WHERE `group` = :group")
fun observeUrlsByGroup(group: Int): LiveData<List<String>> fun observeUrlsByGroup(group: Int): LiveData<List<String>>

@ -147,7 +147,7 @@ class BookSourceActivity : VMBaseActivity<BookSourceViewModel>(R.layout.activity
search_view.queryHint = getString(R.string.search_book_source_num, it.size) search_view.queryHint = getString(R.string.search_book_source_num, it.size)
val diffResult = DiffUtil val diffResult = DiffUtil
.calculateDiff(DiffCallBack(adapter.getItems(), it)) .calculateDiff(DiffCallBack(adapter.getItems(), it))
adapter.setItemsNoNotify(it) adapter.setItems(it, false)
diffResult.dispatchUpdatesTo(adapter) diffResult.dispatchUpdatesTo(adapter)
}) })
} }

@ -44,7 +44,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio
val diffResult = DiffUtil.calculateDiff(DiffCallBack(it.getItems(), books)) val diffResult = DiffUtil.calculateDiff(DiffCallBack(it.getItems(), books))
withContext(Main) { withContext(Main) {
synchronized(this) { synchronized(this) {
it.setItemsNoNotify(books) it.setItems(books, false)
diffResult.dispatchUpdatesTo(it) diffResult.dispatchUpdatesTo(it)
} }
} }

@ -1,12 +1,9 @@
package io.legado.app.ui.main.bookshelf package io.legado.app.ui.main.bookshelf
import android.view.LayoutInflater import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.paging.PagedListAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R 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.constant.BookType
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.help.ImageLoader 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.onClick
import org.jetbrains.anko.sdk27.listeners.onLongClick import org.jetbrains.anko.sdk27.listeners.onLongClick
class BooksAdapter(private val callBack: CallBack) : class BooksAdapter(context: Context, private val callBack: CallBack) :
PagedListAdapter<Book, BooksAdapter.MyViewHolder>(DIFF_CALLBACK) { SimpleRecyclerAdapter<Book>(context, R.layout.item_bookshelf_list) {
companion object { override fun convert(holder: ItemViewHolder, item: Book, payloads: MutableList<Any>) =
@JvmField with(holder.itemView) {
val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Book>() {
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<Any>) {
if (payloads.isEmpty()) { if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads) ATH.applyBackgroundTint(this)
} else { tv_name.text = item.name
currentList?.get(position)?.let { tv_author.text = item.author
holder.bind(it, callBack, payloads[0]) tv_read.text = item.durChapterTitle
} tv_last.text = item.latestChapterTitle
} item.getDisplayCover()?.let {
}
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 {
ImageLoader.load(context, it)//Glide自动识别http://和file:// ImageLoader.load(context, it)//Glide自动识别http://和file://
.placeholder(R.drawable.image_cover_default) .placeholder(R.drawable.image_cover_default)
.error(R.drawable.image_cover_default) .error(R.drawable.image_cover_default)
.centerCrop() .centerCrop()
.setAsDrawable(iv_cover) .setAsDrawable(iv_cover)
} }
itemView.onClick { callBack.open(book) } onClick { callBack.open(item) }
itemView.onLongClick { onLongClick {
callBack.openBookInfo(book) callBack.openBookInfo(item)
true true
} }
if (book.origin != BookType.local && callBack.isUpdate(book.bookUrl)) { if (item.origin != BookType.local && callBack.isUpdate(item.bookUrl)) {
LogUtils.d(book.name, "loading") LogUtils.d(item.name, "loading")
bv_unread.invisible() bv_unread.invisible()
rl_loading.show() rl_loading.show()
} else { } else {
LogUtils.d(book.name, "loadingHide") LogUtils.d(item.name, "loadingHide")
rl_loading.hide() rl_loading.hide()
bv_unread.setBadgeCount(book.getUnreadChapterNum()) bv_unread.setBadgeCount(item.getUnreadChapterNum())
bv_unread.setHighlight(book.lastCheckCount > 0) bv_unread.setHighlight(item.lastCheckCount > 0)
} }
} } else {
when (payloads[0]) {
fun bind(book: Book, callBack: CallBack, payload: Any) = with(itemView) {
when (payload) {
5 -> { 5 -> {
if (book.origin != BookType.local && callBack.isUpdate(book.bookUrl)) { if (item.origin != BookType.local && callBack.isUpdate(item.bookUrl)) {
LogUtils.d(book.name, "loading") LogUtils.d(item.name, "loading")
bv_unread.invisible() bv_unread.invisible()
rl_loading.show() rl_loading.show()
} else { } else {
LogUtils.d(book.name, "loadingHide") LogUtils.d(item.name, "loadingHide")
rl_loading.hide() rl_loading.hide()
bv_unread.setBadgeCount(book.getUnreadChapterNum()) bv_unread.setBadgeCount(item.getUnreadChapterNum())
bv_unread.setHighlight(book.lastCheckCount > 0) 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 { interface CallBack {

@ -5,8 +5,6 @@ import android.view.View
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import io.legado.app.App import io.legado.app.App
@ -44,7 +42,7 @@ class BooksFragment : VMBaseFragment<BooksViewModel>(R.layout.fragment_books),
private lateinit var activityViewModel: MainViewModel private lateinit var activityViewModel: MainViewModel
private lateinit var booksAdapter: BooksAdapter private lateinit var booksAdapter: BooksAdapter
private var bookshelfLiveData: LiveData<PagedList<Book>>? = null private var bookshelfLiveData: LiveData<List<Book>>? = null
private var groupId = -1 private var groupId = -1
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -73,36 +71,23 @@ class BooksFragment : VMBaseFragment<BooksViewModel>(R.layout.fragment_books),
this.setDrawable(it) this.setDrawable(it)
} }
}) })
booksAdapter = BooksAdapter(this) booksAdapter = BooksAdapter(requireContext(), this)
rv_bookshelf.adapter = booksAdapter rv_bookshelf.adapter = booksAdapter
} }
private fun upRecyclerData() { private fun upRecyclerData() {
bookshelfLiveData?.removeObservers(this) bookshelfLiveData?.removeObservers(this)
when (groupId) { bookshelfLiveData = when (groupId) {
-1 -> { -1 -> App.db.bookDao().observeAll()
bookshelfLiveData = -2 -> App.db.bookDao().observeLocal()
LivePagedListBuilder(App.db.bookDao().observeAll(), 100).build() -3 -> App.db.bookDao().observeAudio()
} else -> App.db.bookDao().observeByGroup(groupId)
-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?.observe( bookshelfLiveData?.observe(
this, this,
Observer { pageList -> booksAdapter.submitList(pageList) }) Observer {
booksAdapter.setItems(it)
})
} }
override fun open(book: Book) { override fun open(book: Book) {

@ -104,7 +104,7 @@ class ReplaceRuleActivity : VMBaseActivity<ReplaceRuleViewModel>(R.layout.activi
} }
replaceRuleLiveData?.observe(this, Observer { replaceRuleLiveData?.observe(this, Observer {
val diffResult = DiffUtil.calculateDiff(DiffCallBack(adapter.getItems(), it)) val diffResult = DiffUtil.calculateDiff(DiffCallBack(adapter.getItems(), it))
adapter.setItemsNoNotify(it) adapter.setItems(it, false)
diffResult.dispatchUpdatesTo(adapter) diffResult.dispatchUpdatesTo(adapter)
}) })
} }

@ -152,7 +152,7 @@ class RssSourceActivity : VMBaseActivity<RssSourceViewModel>(R.layout.activity_r
sourceLiveData?.observe(this, Observer { sourceLiveData?.observe(this, Observer {
val diffResult = DiffUtil val diffResult = DiffUtil
.calculateDiff(DiffCallBack(adapter.getItems(), it)) .calculateDiff(DiffCallBack(adapter.getItems(), it))
adapter.setItemsNoNotify(it) adapter.setItems(it, false)
diffResult.dispatchUpdatesTo(adapter) diffResult.dispatchUpdatesTo(adapter)
}) })
} }

Loading…
Cancel
Save