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>?) {
synchronized(lock) {
if (this.items.isNotEmpty()) {
this.items.clear()
}
if (items != null) {
this.items.addAll(items)
}
}
}
fun setItems(items: List<ITEM>?) {
fun setItems(items: List<ITEM>?, notify: Boolean = true) {
synchronized(lock) {
if (this.items.isNotEmpty()) {
this.items.clear()

@ -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<Int, Book>
fun observeAll(): LiveData<List<Book>>
@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")
fun observeLocal(): DataSource.Factory<Int, Book>
fun observeLocal(): LiveData<List<Book>>
@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")
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)
val diffResult = DiffUtil
.calculateDiff(DiffCallBack(adapter.getItems(), it))
adapter.setItemsNoNotify(it)
adapter.setItems(it, false)
diffResult.dispatchUpdatesTo(adapter)
})
}

@ -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)
}
}

@ -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,118 +14,68 @@ 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<Book, BooksAdapter.MyViewHolder>(DIFF_CALLBACK) {
class BooksAdapter(context: Context, private val callBack: CallBack) :
SimpleRecyclerAdapter<Book>(context, R.layout.item_bookshelf_list) {
companion object {
@JvmField
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>) {
override fun convert(holder: ItemViewHolder, item: Book, payloads: MutableList<Any>) =
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 {
fun open(book: Book)
fun openBookInfo(book: Book)

@ -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<BooksViewModel>(R.layout.fragment_books),
private lateinit var activityViewModel: MainViewModel
private lateinit var booksAdapter: BooksAdapter
private var bookshelfLiveData: LiveData<PagedList<Book>>? = null
private var bookshelfLiveData: LiveData<List<Book>>? = null
private var groupId = -1
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -73,36 +71,23 @@ class BooksFragment : VMBaseFragment<BooksViewModel>(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) {

@ -104,7 +104,7 @@ class ReplaceRuleActivity : VMBaseActivity<ReplaceRuleViewModel>(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)
})
}

@ -152,7 +152,7 @@ class RssSourceActivity : VMBaseActivity<RssSourceViewModel>(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)
})
}

Loading…
Cancel
Save