Optimize images in lists

This commit is contained in:
Koitharu
2020-04-03 20:59:34 +03:00
parent a774d2d915
commit 904b78a01e
8 changed files with 43 additions and 17 deletions

View File

@@ -80,6 +80,10 @@ abstract class BaseRecyclerAdapter<T, E>(private val onItemClickListener: OnRecy
onDataSetChanged()
}
override fun onViewRecycled(holder: BaseViewHolder<T, E>) {
holder.onRecycled()
}
final override fun getItemCount() = dataSet.size
final override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<T, E> {

View File

@@ -40,5 +40,7 @@ abstract class BaseViewHolder<T, E> protected constructor(view: View) :
return this
}
open fun onRecycled() = Unit
abstract fun onBind(data: T, extra: E)
}

View File

@@ -1,8 +1,8 @@
package org.koitharu.kotatsu.ui.main.list
import android.view.ViewGroup
import coil.api.clear
import coil.api.load
import coil.request.RequestDisposable
import kotlinx.android.synthetic.main.item_manga_grid.*
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.Manga
@@ -11,16 +11,17 @@ import org.koitharu.kotatsu.ui.common.list.BaseViewHolder
class MangaGridHolder(parent: ViewGroup) : BaseViewHolder<Manga, MangaHistory?>(parent, R.layout.item_manga_grid) {
private var coverRequest: RequestDisposable? = null
override fun onBind(data: Manga, extra: MangaHistory?) {
coverRequest?.dispose()
imageView_cover.setImageDrawable(null)
imageView_cover.clear()
textView_title.text = data.title
coverRequest = imageView_cover.load(data.coverUrl) {
imageView_cover.load(data.coverUrl) {
placeholder(R.drawable.ic_placeholder)
fallback(R.drawable.ic_placeholder)
error(R.drawable.ic_placeholder)
}
}
override fun onRecycled() {
imageView_cover.clear()
}
}

View File

@@ -3,8 +3,8 @@ package org.koitharu.kotatsu.ui.main.list
import android.annotation.SuppressLint
import android.view.ViewGroup
import androidx.core.view.isVisible
import coil.api.clear
import coil.api.load
import coil.request.RequestDisposable
import kotlinx.android.synthetic.main.item_manga_list_details.*
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.Manga
@@ -15,14 +15,12 @@ import kotlin.math.roundToInt
class MangaListDetailsHolder(parent: ViewGroup) : BaseViewHolder<Manga, MangaHistory?>(parent, R.layout.item_manga_list_details) {
private var coverRequest: RequestDisposable? = null
@SuppressLint("SetTextI18n")
override fun onBind(data: Manga, extra: MangaHistory?) {
coverRequest?.dispose()
imageView_cover.clear()
textView_title.text = data.title
textView_subtitle.textAndVisible = data.altTitle
coverRequest = imageView_cover.load(data.coverUrl) {
imageView_cover.load(data.coverUrl) {
placeholder(R.drawable.ic_placeholder)
fallback(R.drawable.ic_placeholder)
error(R.drawable.ic_placeholder)
@@ -37,4 +35,8 @@ class MangaListDetailsHolder(parent: ViewGroup) : BaseViewHolder<Manga, MangaHis
it.title
}
}
override fun onRecycled() {
imageView_cover.clear()
}
}

View File

@@ -1,8 +1,8 @@
package org.koitharu.kotatsu.ui.main.list
import android.view.ViewGroup
import coil.api.clear
import coil.api.load
import coil.request.RequestDisposable
import kotlinx.android.synthetic.main.item_manga_list.*
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.Manga
@@ -13,16 +13,18 @@ import org.koitharu.kotatsu.utils.ext.textAndVisible
class MangaListHolder(parent: ViewGroup) :
BaseViewHolder<Manga, MangaHistory?>(parent, R.layout.item_manga_list) {
private var coverRequest: RequestDisposable? = null
override fun onBind(data: Manga, extra: MangaHistory?) {
coverRequest?.dispose()
imageView_cover.clear()
textView_title.text = data.title
textView_subtitle.textAndVisible = data.tags.joinToString(", ") { it.title }
coverRequest = imageView_cover.load(data.coverUrl) {
imageView_cover.load(data.coverUrl) {
placeholder(R.drawable.ic_placeholder)
fallback(R.drawable.ic_placeholder)
error(R.drawable.ic_placeholder)
}
}
override fun onRecycled() {
imageView_cover.clear()
}
}

View File

@@ -30,6 +30,11 @@ class PageHolder(parent: ViewGroup, private val loader: PageLoader) :
doLoad(data, force = false)
}
override fun onRecycled() {
job?.cancel()
ssiv.recycle()
}
private fun doLoad(data: MangaPage, force: Boolean) {
job?.cancel()
job = launch {

View File

@@ -50,4 +50,9 @@ class PageThumbnailHolder(parent: ViewGroup, private val scope: CoroutineScope)
}
}
}
override fun onRecycled() {
job?.cancel()
imageView_thumb.setImageDrawable(null)
}
}

View File

@@ -6,7 +6,7 @@ import androidx.core.net.toUri
import androidx.core.view.isVisible
import com.davemorrissey.labs.subscaleview.ImageSource
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import kotlinx.android.synthetic.main.item_page.*
import kotlinx.android.synthetic.main.item_page_webtoon.*
import kotlinx.coroutines.*
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.MangaPage
@@ -53,6 +53,11 @@ class WebtoonHolder(parent: ViewGroup, private val loader: PageLoader) :
}
}
override fun onRecycled() {
job?.cancel()
ssiv.recycle()
}
fun getScrollY() = ssiv.center?.y ?: 0f
fun restoreScroll(scroll: Float) {