pull/94/head
kunfei 5 years ago
parent 4f3239779f
commit 96b3846313
  1. 49
      app/src/main/java/io/legado/app/ui/book/search/DiffCallBack.kt
  2. 106
      app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt

@ -3,21 +3,48 @@ package io.legado.app.ui.book.search
import androidx.recyclerview.widget.DiffUtil
import io.legado.app.data.entities.SearchBook
class DiffCallBack : DiffUtil.ItemCallback<SearchBook>() {
override fun areItemsTheSame(oldItem: SearchBook, newItem: SearchBook): Boolean {
return oldItem.name == newItem.name
&& oldItem.author == newItem.author
class DiffCallBack(private val oldItems: List<SearchBook>, private val newItems: List<SearchBook>) :
DiffUtil.Callback() {
override fun getNewListSize(): Int {
return newItems.size
}
override fun getOldListSize(): Int {
return oldItems.size
}
override fun areContentsTheSame(oldItem: SearchBook, newItem: SearchBook): Boolean {
return oldItem.origins?.size == newItem.origins?.size
&& (oldItem.coverUrl == newItem.coverUrl || !oldItem.coverUrl.isNullOrEmpty())
&& (oldItem.kind == newItem.kind || !oldItem.kind.isNullOrEmpty())
&& (oldItem.latestChapterTitle == newItem.latestChapterTitle || !oldItem.kind.isNullOrEmpty())
&& oldItem.intro?.length ?: 0 > newItem.intro?.length ?: 0
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return true
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
val oldItem = oldItems[oldItemPosition]
val newItem = newItems[newItemPosition]
if (oldItem.name != newItem.name) {
return false
}
if (oldItem.author != newItem.author) {
return false
}
if (oldItem.kind != newItem.kind) {
return false
}
if (oldItem.latestChapterTitle != newItem.latestChapterTitle) {
return false
}
if (oldItem.intro != newItem.intro) {
return false
}
if (oldItem.coverUrl != newItem.coverUrl) {
return false
}
return true
}
override fun getChangePayload(oldItem: SearchBook, newItem: SearchBook): Any? {
override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? {
val oldItem = oldItems[oldItemPosition]
val newItem = newItems[newItemPosition]
return when {
oldItem.origins?.size != newItem.origins?.size -> 1
oldItem.coverUrl != newItem.coverUrl -> 2

@ -1,12 +1,12 @@
package io.legado.app.ui.book.search
import android.content.Context
import android.os.Bundle
import android.view.View
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.data.entities.SearchBook
import io.legado.app.help.ImageLoader
import io.legado.app.utils.gone
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_bookshelf_list.view.iv_cover
@ -18,10 +18,11 @@ class SearchAdapter(context: Context, val callBack: CallBack) :
SimpleRecyclerAdapter<SearchBook>(context, R.layout.item_search) {
override fun convert(holder: ItemViewHolder, item: SearchBook, payloads: MutableList<Any>) {
if (payloads.isEmpty()) {
val bundle = payloads.getOrNull(0) as? Bundle
if (bundle == null) {
bind(holder.itemView, item)
} else {
bindChange(holder.itemView, item, payloads)
bindChange(holder.itemView, item, bundle)
}
}
@ -30,63 +31,54 @@ class SearchAdapter(context: Context, val callBack: CallBack) :
tv_name.text = searchBook.name
tv_author.text = context.getString(R.string.author_show, searchBook.author)
bv_originCount.setBadgeCount(searchBook.origins?.size ?: 1)
if (searchBook.latestChapterTitle.isNullOrEmpty()) {
tv_lasted.gone()
} else {
tv_lasted.text = context.getString(R.string.lasted_show, searchBook.latestChapterTitle)
tv_lasted.visible()
}
upLasted(itemView, searchBook.latestChapterTitle)
tv_introduce.text = context.getString(R.string.intro_show, searchBook.intro)
val kinds = searchBook.getKindList()
if (kinds.isEmpty()) {
ll_kind.gone()
} else {
ll_kind.visible()
for (index in 0..2) {
if (kinds.size > index) {
when (index) {
0 -> {
tv_kind.text = kinds[index]
tv_kind.visible()
}
1 -> {
tv_kind_1.text = kinds[index]
tv_kind_1.visible()
upKind(itemView, searchBook.getKindList())
iv_cover.load(searchBook.coverUrl, searchBook.name, searchBook.author)
onClick {
callBack.showBookInfo(searchBook.name, searchBook.author)
}
2 -> {
tv_kind_2.text = kinds[index]
tv_kind_2.visible()
}
}
} else {
when (index) {
0 -> tv_kind.gone()
1 -> tv_kind_1.gone()
2 -> tv_kind_2.gone()
private fun bindChange(itemView: View, searchBook: SearchBook, bundle: Bundle) {
with(itemView) {
bundle.keySet().map {
when (it) {
"name" -> tv_name.text = searchBook.name
"author" -> tv_author.text =
context.getString(R.string.author_show, searchBook.author)
"originCount" -> bv_originCount.setBadgeCount(searchBook.origins?.size ?: 1)
"lasted" -> upLasted(itemView, searchBook.latestChapterTitle)
"introduce" -> tv_introduce.text =
context.getString(R.string.intro_show, searchBook.intro)
"kind" -> upKind(itemView, searchBook.getKindList())
"cover" -> iv_cover.load(
searchBook.coverUrl,
searchBook.name,
searchBook.author
)
}
}
}
}
iv_cover.load(searchBook.coverUrl, searchBook.name, searchBook.author)
onClick {
callBack.showBookInfo(searchBook.name, searchBook.author)
private fun upLasted(itemView: View, latestChapterTitle: String?) {
with(itemView) {
if (latestChapterTitle.isNullOrEmpty()) {
tv_lasted.gone()
} else {
tv_lasted.text =
context.getString(
R.string.lasted_show,
latestChapterTitle
)
tv_lasted.visible()
}
}
}
private fun bindChange(itemView: View, searchBook: SearchBook, payloads: MutableList<Any>) {
with(itemView) {
when (payloads[0]) {
1 -> bv_originCount.setBadgeCount(searchBook.origins?.size ?: 1)
2 -> searchBook.coverUrl.let {
ImageLoader.load(context, it)//Glide自动识别http://和file://
.placeholder(R.drawable.image_cover_default)
.error(R.drawable.image_cover_default)
.centerCrop()
.into(iv_cover)
}
3 -> {
val kinds = searchBook.getKindList()
private fun upKind(itemView: View, kinds: List<String>) = with(itemView) {
if (kinds.isEmpty()) {
ll_kind.gone()
} else {
@ -117,24 +109,6 @@ class SearchAdapter(context: Context, val callBack: CallBack) :
}
}
}
4 -> {
if (searchBook.latestChapterTitle.isNullOrEmpty()) {
tv_lasted.gone()
} else {
tv_lasted.text = context.getString(
R.string.lasted_show,
searchBook.latestChapterTitle
)
tv_lasted.visible()
}
}
5 -> tv_introduce.text =
context.getString(R.string.intro_show, searchBook.intro)
else -> {
}
}
}
}
interface CallBack {
fun showBookInfo(name: String, author: String)

Loading…
Cancel
Save