优化
This commit is contained in:
@@ -19,8 +19,7 @@ import io.legado.app.utils.gone
|
|||||||
import io.legado.app.utils.longToastOnUi
|
import io.legado.app.utils.longToastOnUi
|
||||||
import io.legado.app.utils.visible
|
import io.legado.app.utils.visible
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.isActive
|
import kotlinx.coroutines.ensureActive
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
class ChapterListAdapter(context: Context, val callback: Callback) :
|
class ChapterListAdapter(context: Context, val callback: Callback) :
|
||||||
@@ -58,51 +57,55 @@ class ChapterListAdapter(context: Context, val callback: Callback) :
|
|||||||
get() = callback.book?.let {
|
get() = callback.book?.let {
|
||||||
ContentProcessor.get(it.name, it.origin).getTitleReplaceRules()
|
ContentProcessor.get(it.name, it.origin).getTitleReplaceRules()
|
||||||
}
|
}
|
||||||
private val useReplace
|
private var useReplace = AppConfig.tocUiUseReplace && callback.book?.getUseReplaceRule() == true
|
||||||
get() = AppConfig.tocUiUseReplace && callback.book?.getUseReplaceRule() == true
|
|
||||||
private var upDisplayTileJob: Coroutine<*>? = null
|
private var upDisplayTileJob: Coroutine<*>? = null
|
||||||
|
|
||||||
override fun onCurrentListChanged() {
|
override fun onCurrentListChanged() {
|
||||||
super.onCurrentListChanged()
|
super.onCurrentListChanged()
|
||||||
upDisplayTitle()
|
|
||||||
callback.onListChanged()
|
callback.onListChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clearDisplayTitle() {
|
fun clearDisplayTitle() {
|
||||||
|
useReplace = AppConfig.tocUiUseReplace && callback.book?.getUseReplaceRule() == true
|
||||||
upDisplayTileJob?.cancel()
|
upDisplayTileJob?.cancel()
|
||||||
displayTitleMap.clear()
|
displayTitleMap.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun upDisplayTitle() {
|
fun upDisplayTitle(startIndex: Int) {
|
||||||
upDisplayTileJob?.cancel()
|
upDisplayTileJob?.cancel()
|
||||||
upDisplayTileJob = Coroutine.async(callback.scope) {
|
upDisplayTileJob = Coroutine.async(callback.scope) {
|
||||||
val replaceRules = replaceRules
|
val replaceRules = replaceRules
|
||||||
val useReplace = useReplace
|
val useReplace = useReplace
|
||||||
getItems().forEach {
|
val items = getItems()
|
||||||
if (!isActive) {
|
for (i in startIndex until items.size) {
|
||||||
return@async
|
val item = items[i]
|
||||||
|
if (displayTitleMap[item.title] == null) {
|
||||||
|
ensureActive()
|
||||||
|
val displayTitle = item.getDisplayTitle(replaceRules, useReplace)
|
||||||
|
ensureActive()
|
||||||
|
displayTitleMap[item.title] = displayTitle
|
||||||
|
notifyItemChanged(i, true)
|
||||||
}
|
}
|
||||||
if (displayTitleMap[it.title] == null) {
|
}
|
||||||
displayTitleMap[it.title] = it.getDisplayTitle(replaceRules, useReplace)
|
for (i in 0 until startIndex) {
|
||||||
|
val item = items[i]
|
||||||
|
if (displayTitleMap[item.title] == null) {
|
||||||
|
ensureActive()
|
||||||
|
val displayTitle = item.getDisplayTitle(replaceRules, useReplace)
|
||||||
|
ensureActive()
|
||||||
|
displayTitleMap[item.title] = displayTitle
|
||||||
|
notifyItemChanged(i, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getViewBinding(parent: ViewGroup): ItemChapterListBinding {
|
private fun getDisplayTitle(chapter: BookChapter): String {
|
||||||
return ItemChapterListBinding.inflate(inflater, parent, false)
|
return displayTitleMap[chapter.title] ?: chapter.title
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getDisplayTile(chapter: BookChapter): String {
|
override fun getViewBinding(parent: ViewGroup): ItemChapterListBinding {
|
||||||
var displayTitle = displayTitleMap[chapter.title]
|
return ItemChapterListBinding.inflate(inflater, parent, false)
|
||||||
if (displayTitle != null) {
|
|
||||||
return displayTitle
|
|
||||||
}
|
|
||||||
displayTitle = runBlocking {
|
|
||||||
chapter.getDisplayTitle(replaceRules, useReplace)
|
|
||||||
}
|
|
||||||
displayTitleMap[chapter.title] = displayTitle
|
|
||||||
return displayTitle
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun convert(
|
override fun convert(
|
||||||
@@ -120,7 +123,7 @@ class ChapterListAdapter(context: Context, val callback: Callback) :
|
|||||||
} else {
|
} else {
|
||||||
tvChapterName.setTextColor(context.getCompatColor(R.color.primaryText))
|
tvChapterName.setTextColor(context.getCompatColor(R.color.primaryText))
|
||||||
}
|
}
|
||||||
tvChapterName.text = getDisplayTile(item)
|
tvChapterName.text = getDisplayTitle(item)
|
||||||
if (item.isVolume) {
|
if (item.isVolume) {
|
||||||
//卷名,如第一卷 突出显示
|
//卷名,如第一卷 突出显示
|
||||||
tvChapterItem.setBackgroundColor(context.getCompatColor(R.color.btn_bg_press))
|
tvChapterItem.setBackgroundColor(context.getCompatColor(R.color.btn_bg_press))
|
||||||
@@ -150,8 +153,8 @@ class ChapterListAdapter(context: Context, val callback: Callback) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
holder.itemView.setOnLongClickListener {
|
holder.itemView.setOnLongClickListener {
|
||||||
getItem(holder.layoutPosition)?.let {
|
getItem(holder.layoutPosition)?.let { item ->
|
||||||
context.longToastOnUi(getDisplayTile(it))
|
context.longToastOnUi(getDisplayTitle(item))
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,7 +97,15 @@ class ChapterListFragment : VMBaseFragment<TocViewModel>(R.layout.fragment_chapt
|
|||||||
viewModel.bookData.value?.bookUrl?.let { bookUrl ->
|
viewModel.bookData.value?.bookUrl?.let { bookUrl ->
|
||||||
if (chapter.bookUrl == bookUrl) {
|
if (chapter.bookUrl == bookUrl) {
|
||||||
adapter.cacheFileNames.add(chapter.getFileName())
|
adapter.cacheFileNames.add(chapter.getFileName())
|
||||||
adapter.notifyItemChanged(chapter.index, true)
|
if (viewModel.searchKey.isNullOrEmpty()) {
|
||||||
|
adapter.notifyItemChanged(chapter.index, true)
|
||||||
|
} else {
|
||||||
|
adapter.getItems().forEachIndexed { index, bookChapter ->
|
||||||
|
if (bookChapter.index == chapter.index) {
|
||||||
|
adapter.notifyItemChanged(index, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,12 +136,13 @@ class ChapterListFragment : VMBaseFragment<TocViewModel>(R.layout.fragment_chapt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
mLayoutManager.scrollToPositionWithOffset(scrollPos, 0)
|
mLayoutManager.scrollToPositionWithOffset(scrollPos, 0)
|
||||||
|
adapter.upDisplayTitle(scrollPos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun clearDisplayTitle() {
|
override fun clearDisplayTitle() {
|
||||||
adapter.clearDisplayTitle()
|
adapter.clearDisplayTitle()
|
||||||
adapter.upDisplayTitle()
|
adapter.upDisplayTitle(mLayoutManager.findFirstVisibleItemPosition())
|
||||||
}
|
}
|
||||||
|
|
||||||
override val scope: CoroutineScope
|
override val scope: CoroutineScope
|
||||||
|
|||||||
@@ -59,10 +59,12 @@ class TocActivity : VMBaseActivity<ActivityChapterListBinding, TocViewModel>() {
|
|||||||
setOnSearchClickListener { tabLayout.gone() }
|
setOnSearchClickListener { tabLayout.gone() }
|
||||||
setOnQueryTextListener(object : SearchView.OnQueryTextListener {
|
setOnQueryTextListener(object : SearchView.OnQueryTextListener {
|
||||||
override fun onQueryTextSubmit(query: String): Boolean {
|
override fun onQueryTextSubmit(query: String): Boolean {
|
||||||
|
viewModel.searchKey = query
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onQueryTextChange(newText: String): Boolean {
|
override fun onQueryTextChange(newText: String): Boolean {
|
||||||
|
viewModel.searchKey = newText
|
||||||
if (tabLayout.selectedTabPosition == 1) {
|
if (tabLayout.selectedTabPosition == 1) {
|
||||||
viewModel.startBookmarkSearch(newText)
|
viewModel.startBookmarkSearch(newText)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ class TocViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
var bookData = MutableLiveData<Book>()
|
var bookData = MutableLiveData<Book>()
|
||||||
var chapterListCallBack: ChapterListCallBack? = null
|
var chapterListCallBack: ChapterListCallBack? = null
|
||||||
var bookMarkCallBack: BookmarkCallBack? = null
|
var bookMarkCallBack: BookmarkCallBack? = null
|
||||||
|
var searchKey: String? = null
|
||||||
|
|
||||||
fun initBook(bookUrl: String) {
|
fun initBook(bookUrl: String) {
|
||||||
this.bookUrl = bookUrl
|
this.bookUrl = bookUrl
|
||||||
|
|||||||
Reference in New Issue
Block a user