mirror of
https://github.com/mihonapp/mihon.git
synced 2024-11-07 11:17:25 +01:00
Fix catalog covers' flickering when adding a page
This commit is contained in:
parent
9de3da33aa
commit
e73eed4a9b
@ -26,7 +26,7 @@ class CatalogueAdapter(val fragment: CatalogueFragment) : FlexibleAdapter<Catalo
|
|||||||
get() = mItems
|
get() = mItems
|
||||||
|
|
||||||
init {
|
init {
|
||||||
mItems = ArrayList<Manga>()
|
mItems = ArrayList()
|
||||||
setHasStableIds(true)
|
setHasStableIds(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,8 +36,9 @@ class CatalogueAdapter(val fragment: CatalogueFragment) : FlexibleAdapter<Catalo
|
|||||||
* @param list the list to add.
|
* @param list the list to add.
|
||||||
*/
|
*/
|
||||||
fun addItems(list: List<Manga>) {
|
fun addItems(list: List<Manga>) {
|
||||||
|
val sizeBeforeAdding = mItems.size
|
||||||
mItems.addAll(list)
|
mItems.addAll(list)
|
||||||
notifyDataSetChanged()
|
notifyItemRangeInserted(sizeBeforeAdding, list.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.ui.catalogue
|
|||||||
|
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.support.v7.app.AppCompatActivity
|
|
||||||
import android.support.v7.widget.GridLayoutManager
|
import android.support.v7.widget.GridLayoutManager
|
||||||
import android.support.v7.widget.SearchView
|
import android.support.v7.widget.SearchView
|
||||||
import android.support.v7.widget.Toolbar
|
import android.support.v7.widget.Toolbar
|
||||||
@ -24,8 +23,7 @@ import eu.kanade.tachiyomi.ui.manga.MangaActivity
|
|||||||
import eu.kanade.tachiyomi.util.getResourceDrawable
|
import eu.kanade.tachiyomi.util.getResourceDrawable
|
||||||
import eu.kanade.tachiyomi.util.snack
|
import eu.kanade.tachiyomi.util.snack
|
||||||
import eu.kanade.tachiyomi.util.toast
|
import eu.kanade.tachiyomi.util.toast
|
||||||
import eu.kanade.tachiyomi.widget.EndlessGridScrollListener
|
import eu.kanade.tachiyomi.widget.EndlessScrollListener
|
||||||
import eu.kanade.tachiyomi.widget.EndlessListScrollListener
|
|
||||||
import eu.kanade.tachiyomi.widget.NpaLinearLayoutManager
|
import eu.kanade.tachiyomi.widget.NpaLinearLayoutManager
|
||||||
import kotlinx.android.synthetic.main.fragment_catalogue.*
|
import kotlinx.android.synthetic.main.fragment_catalogue.*
|
||||||
import kotlinx.android.synthetic.main.toolbar.*
|
import kotlinx.android.synthetic.main.toolbar.*
|
||||||
@ -56,12 +54,12 @@ class CatalogueFragment : BaseRxFragment<CataloguePresenter>(), FlexibleViewHold
|
|||||||
/**
|
/**
|
||||||
* Scroll listener for grid mode. It loads next pages when the end of the list is reached.
|
* Scroll listener for grid mode. It loads next pages when the end of the list is reached.
|
||||||
*/
|
*/
|
||||||
private lateinit var gridScrollListener: EndlessGridScrollListener
|
private lateinit var gridScrollListener: EndlessScrollListener
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scroll listener for list mode. It loads next pages when the end of the list is reached.
|
* Scroll listener for list mode. It loads next pages when the end of the list is reached.
|
||||||
*/
|
*/
|
||||||
private lateinit var listScrollListener: EndlessListScrollListener
|
private lateinit var listScrollListener: EndlessScrollListener
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query of the search box.
|
* Query of the search box.
|
||||||
@ -135,13 +133,13 @@ class CatalogueFragment : BaseRxFragment<CataloguePresenter>(), FlexibleViewHold
|
|||||||
adapter = CatalogueAdapter(this)
|
adapter = CatalogueAdapter(this)
|
||||||
|
|
||||||
val glm = catalogue_grid.layoutManager as GridLayoutManager
|
val glm = catalogue_grid.layoutManager as GridLayoutManager
|
||||||
gridScrollListener = EndlessGridScrollListener(glm, { requestNextPage() })
|
gridScrollListener = EndlessScrollListener(glm, { requestNextPage() })
|
||||||
catalogue_grid.setHasFixedSize(true)
|
catalogue_grid.setHasFixedSize(true)
|
||||||
catalogue_grid.adapter = adapter
|
catalogue_grid.adapter = adapter
|
||||||
catalogue_grid.addOnScrollListener(gridScrollListener)
|
catalogue_grid.addOnScrollListener(gridScrollListener)
|
||||||
|
|
||||||
val llm = NpaLinearLayoutManager(activity)
|
val llm = NpaLinearLayoutManager(activity)
|
||||||
listScrollListener = EndlessListScrollListener(llm, { requestNextPage() })
|
listScrollListener = EndlessScrollListener(llm, { requestNextPage() })
|
||||||
catalogue_list.setHasFixedSize(true)
|
catalogue_list.setHasFixedSize(true)
|
||||||
catalogue_list.adapter = adapter
|
catalogue_list.adapter = adapter
|
||||||
catalogue_list.layoutManager = llm
|
catalogue_list.layoutManager = llm
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.widget;
|
|
||||||
|
|
||||||
import android.support.v7.widget.GridLayoutManager;
|
|
||||||
import android.support.v7.widget.RecyclerView;
|
|
||||||
|
|
||||||
import rx.functions.Action0;
|
|
||||||
|
|
||||||
public class EndlessGridScrollListener extends RecyclerView.OnScrollListener {
|
|
||||||
|
|
||||||
private int previousTotal = 0; // The total number of items in the dataset after the last load
|
|
||||||
private boolean loading = true; // True if we are still waiting for the last set of data to load.
|
|
||||||
private static final int VISIBLE_THRESHOLD = 5; // The minimum amount of items to have below your current scroll position before loading more.
|
|
||||||
private int firstVisibleItem, visibleItemCount, totalItemCount;
|
|
||||||
|
|
||||||
private final GridLayoutManager layoutManager;
|
|
||||||
|
|
||||||
private final Action0 requestNext;
|
|
||||||
|
|
||||||
public EndlessGridScrollListener(GridLayoutManager layoutManager, Action0 requestNext) {
|
|
||||||
this.layoutManager = layoutManager;
|
|
||||||
this.requestNext = requestNext;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void resetScroll() {
|
|
||||||
previousTotal = 0;
|
|
||||||
loading = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
|
|
||||||
super.onScrolled(recyclerView, dx, dy);
|
|
||||||
|
|
||||||
visibleItemCount = recyclerView.getChildCount();
|
|
||||||
totalItemCount = layoutManager.getItemCount();
|
|
||||||
firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
|
|
||||||
|
|
||||||
if (loading && (totalItemCount > previousTotal)) {
|
|
||||||
loading = false;
|
|
||||||
previousTotal = totalItemCount;
|
|
||||||
}
|
|
||||||
if (!loading && (totalItemCount - visibleItemCount)
|
|
||||||
<= (firstVisibleItem + VISIBLE_THRESHOLD)) {
|
|
||||||
// End has been reached
|
|
||||||
requestNext.call();
|
|
||||||
loading = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.widget;
|
|
||||||
|
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
|
||||||
import android.support.v7.widget.RecyclerView;
|
|
||||||
|
|
||||||
import rx.functions.Action0;
|
|
||||||
|
|
||||||
public class EndlessListScrollListener extends RecyclerView.OnScrollListener {
|
|
||||||
|
|
||||||
private int previousTotal = 0; // The total number of items in the dataset after the last load
|
|
||||||
private boolean loading = true; // True if we are still waiting for the last set of data to load.
|
|
||||||
private static final int VISIBLE_THRESHOLD = 5; // The minimum amount of items to have below your current scroll position before loading more.
|
|
||||||
private int firstVisibleItem, visibleItemCount, totalItemCount;
|
|
||||||
|
|
||||||
private LinearLayoutManager layoutManager;
|
|
||||||
|
|
||||||
private final Action0 requestNext;
|
|
||||||
|
|
||||||
public EndlessListScrollListener(LinearLayoutManager layoutManager, Action0 requestNext) {
|
|
||||||
this.layoutManager = layoutManager;
|
|
||||||
this.requestNext = requestNext;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void resetScroll() {
|
|
||||||
previousTotal = 0;
|
|
||||||
loading = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
|
|
||||||
super.onScrolled(recyclerView, dx, dy);
|
|
||||||
|
|
||||||
visibleItemCount = recyclerView.getChildCount();
|
|
||||||
totalItemCount = layoutManager.getItemCount();
|
|
||||||
firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
|
|
||||||
|
|
||||||
if (loading && (totalItemCount > previousTotal)) {
|
|
||||||
loading = false;
|
|
||||||
previousTotal = totalItemCount;
|
|
||||||
}
|
|
||||||
if (!loading && (totalItemCount - visibleItemCount)
|
|
||||||
<= (firstVisibleItem + VISIBLE_THRESHOLD)) {
|
|
||||||
// End has been reached
|
|
||||||
requestNext.call();
|
|
||||||
loading = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.widget;
|
|
||||||
|
|
||||||
import android.widget.AbsListView;
|
|
||||||
|
|
||||||
import rx.functions.Action0;
|
|
||||||
|
|
||||||
public class EndlessScrollListener implements AbsListView.OnScrollListener {
|
|
||||||
// The minimum amount of items to have below your current scroll position
|
|
||||||
// before loading more.
|
|
||||||
private static final int VISIBLE_THRESHOLD = 5;
|
|
||||||
// The total number of items in the dataset after the last load
|
|
||||||
private int previousTotalItemCount = 0;
|
|
||||||
// True if we are still waiting for the last set of data to load.
|
|
||||||
private boolean loading = true;
|
|
||||||
|
|
||||||
private final Action0 requestNext;
|
|
||||||
|
|
||||||
public EndlessScrollListener(Action0 requestNext) {
|
|
||||||
this.requestNext = requestNext;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void resetScroll() {
|
|
||||||
this.previousTotalItemCount = 0;
|
|
||||||
this.loading = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This happens many times a second during a scroll, so be wary of the code you place here.
|
|
||||||
// We are given a few useful parameters to help us work out if we need to load some more data,
|
|
||||||
// but first we check if we are waiting for the previous load to finish.
|
|
||||||
@Override
|
|
||||||
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
|
|
||||||
{
|
|
||||||
// If the total item count is zero and the previous isn't, assume the
|
|
||||||
// list is invalidated and should be reset back to initial state
|
|
||||||
if (totalItemCount < previousTotalItemCount) {
|
|
||||||
this.previousTotalItemCount = totalItemCount;
|
|
||||||
if (totalItemCount == 0) { this.loading = true; }
|
|
||||||
}
|
|
||||||
// If it’s still loading, we check to see if the dataset count has
|
|
||||||
// changed, if so we conclude it has finished loading and update the current page
|
|
||||||
// number and total item count.
|
|
||||||
if (loading && (totalItemCount > previousTotalItemCount)) {
|
|
||||||
loading = false;
|
|
||||||
previousTotalItemCount = totalItemCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If it isn’t currently loading, we check to see if we have breached
|
|
||||||
// the visibleThreshold and need to reload more data.
|
|
||||||
// If we do need to reload some more data, we execute onLoadMore to fetch the data.
|
|
||||||
if (!loading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + VISIBLE_THRESHOLD)) {
|
|
||||||
requestNext.call();
|
|
||||||
loading = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onScrollStateChanged(AbsListView view, int scrollState) {
|
|
||||||
// Don't take any action on changed
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,46 @@
|
|||||||
|
package eu.kanade.tachiyomi.widget
|
||||||
|
|
||||||
|
import android.support.v7.widget.LinearLayoutManager
|
||||||
|
import android.support.v7.widget.RecyclerView
|
||||||
|
|
||||||
|
class EndlessScrollListener(
|
||||||
|
private val layoutManager: LinearLayoutManager,
|
||||||
|
private val requestNext: () -> Unit)
|
||||||
|
: RecyclerView.OnScrollListener() {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
// The minimum amount of items to have below your current scroll position before loading
|
||||||
|
// more.
|
||||||
|
private val VISIBLE_THRESHOLD = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
private var previousTotal = 0 // The total number of items in the dataset after the last load
|
||||||
|
private var loading = true // True if we are still waiting for the last set of data to load.
|
||||||
|
private var firstVisibleItem = 0
|
||||||
|
private var visibleItemCount = 0
|
||||||
|
private var totalItemCount = 0
|
||||||
|
|
||||||
|
fun resetScroll() {
|
||||||
|
previousTotal = 0
|
||||||
|
loading = true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
||||||
|
super.onScrolled(recyclerView, dx, dy)
|
||||||
|
|
||||||
|
visibleItemCount = recyclerView.childCount
|
||||||
|
totalItemCount = layoutManager.itemCount
|
||||||
|
firstVisibleItem = layoutManager.findFirstVisibleItemPosition()
|
||||||
|
|
||||||
|
if (loading && totalItemCount > previousTotal) {
|
||||||
|
loading = false
|
||||||
|
previousTotal = totalItemCount
|
||||||
|
}
|
||||||
|
if (!loading && totalItemCount - visibleItemCount <= firstVisibleItem + VISIBLE_THRESHOLD) {
|
||||||
|
// End has been reached
|
||||||
|
requestNext()
|
||||||
|
loading = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user