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 androidx.recyclerview.widget.DiffUtil
import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.SearchBook
class DiffCallBack : DiffUtil.ItemCallback<SearchBook>() { class DiffCallBack(private val oldItems: List<SearchBook>, private val newItems: List<SearchBook>) :
override fun areItemsTheSame(oldItem: SearchBook, newItem: SearchBook): Boolean { DiffUtil.Callback() {
return oldItem.name == newItem.name
&& oldItem.author == newItem.author override fun getNewListSize(): Int {
return newItems.size
}
override fun getOldListSize(): Int {
return oldItems.size
} }
override fun areContentsTheSame(oldItem: SearchBook, newItem: SearchBook): Boolean { override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldItem.origins?.size == newItem.origins?.size return true
&& (oldItem.coverUrl == newItem.coverUrl || !oldItem.coverUrl.isNullOrEmpty()) }
&& (oldItem.kind == newItem.kind || !oldItem.kind.isNullOrEmpty())
&& (oldItem.latestChapterTitle == newItem.latestChapterTitle || !oldItem.kind.isNullOrEmpty()) override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
&& oldItem.intro?.length ?: 0 > newItem.intro?.length ?: 0 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 { return when {
oldItem.origins?.size != newItem.origins?.size -> 1 oldItem.origins?.size != newItem.origins?.size -> 1
oldItem.coverUrl != newItem.coverUrl -> 2 oldItem.coverUrl != newItem.coverUrl -> 2

@ -1,12 +1,12 @@
package io.legado.app.ui.book.search package io.legado.app.ui.book.search
import android.content.Context import android.content.Context
import android.os.Bundle
import android.view.View import android.view.View
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.SearchBook
import io.legado.app.help.ImageLoader
import io.legado.app.utils.gone import io.legado.app.utils.gone
import io.legado.app.utils.visible import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_bookshelf_list.view.iv_cover 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) { SimpleRecyclerAdapter<SearchBook>(context, R.layout.item_search) {
override fun convert(holder: ItemViewHolder, item: SearchBook, payloads: MutableList<Any>) { 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) bind(holder.itemView, item)
} else { } 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_name.text = searchBook.name
tv_author.text = context.getString(R.string.author_show, searchBook.author) tv_author.text = context.getString(R.string.author_show, searchBook.author)
bv_originCount.setBadgeCount(searchBook.origins?.size ?: 1) bv_originCount.setBadgeCount(searchBook.origins?.size ?: 1)
if (searchBook.latestChapterTitle.isNullOrEmpty()) { upLasted(itemView, searchBook.latestChapterTitle)
tv_lasted.gone()
} else {
tv_lasted.text = context.getString(R.string.lasted_show, searchBook.latestChapterTitle)
tv_lasted.visible()
}
tv_introduce.text = context.getString(R.string.intro_show, searchBook.intro) tv_introduce.text = context.getString(R.string.intro_show, searchBook.intro)
val kinds = searchBook.getKindList() upKind(itemView, searchBook.getKindList())
if (kinds.isEmpty()) { iv_cover.load(searchBook.coverUrl, searchBook.name, searchBook.author)
ll_kind.gone() onClick {
} else { callBack.showBookInfo(searchBook.name, searchBook.author)
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()
} }
2 -> {
tv_kind_2.text = kinds[index]
tv_kind_2.visible()
} }
} }
} else {
when (index) { private fun bindChange(itemView: View, searchBook: SearchBook, bundle: Bundle) {
0 -> tv_kind.gone() with(itemView) {
1 -> tv_kind_1.gone() bundle.keySet().map {
2 -> tv_kind_2.gone() 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 { private fun upLasted(itemView: View, latestChapterTitle: String?) {
callBack.showBookInfo(searchBook.name, searchBook.author) 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>) { private fun upKind(itemView: View, kinds: List<String>) = with(itemView) {
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()
if (kinds.isEmpty()) { if (kinds.isEmpty()) {
ll_kind.gone() ll_kind.gone()
} else { } 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 { interface CallBack {
fun showBookInfo(name: String, author: String) fun showBookInfo(name: String, author: String)

Loading…
Cancel
Save