-
Notifications
You must be signed in to change notification settings - Fork 212
Commit
…ination
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package com.droidcba.kedditbysteps.commons | ||
|
||
import android.support.v7.widget.LinearLayoutManager | ||
import android.support.v7.widget.RecyclerView | ||
import android.util.Log | ||
|
||
class InfiniteScrollListener( | ||
val func: () -> Unit, | ||
val layoutManager: LinearLayoutManager) : RecyclerView.OnScrollListener() { | ||
|
||
private var previousTotal = 0 | ||
private var loading = true | ||
private var visibleThreshold = 2 | ||
private var firstVisibleItem = 0 | ||
private var visibleItemCount = 0 | ||
private var totalItemCount = 0 | ||
|
||
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { | ||
super.onScrolled(recyclerView, dx, dy) | ||
|
||
if (dy > 0) { | ||
visibleItemCount = recyclerView.childCount; | ||
totalItemCount = layoutManager.itemCount; | ||
firstVisibleItem = layoutManager.findFirstVisibleItemPosition(); | ||
|
||
if (loading) { | ||
if (totalItemCount > previousTotal) { | ||
loading = false; | ||
previousTotal = totalItemCount; | ||
} | ||
} | ||
if (!loading && (totalItemCount - visibleItemCount) | ||
<= (firstVisibleItem + visibleThreshold)) { | ||
// End has been reached | ||
Log.i("InfiniteScrollListener", "End reached"); | ||
func() | ||
loading = true; | ||
} | ||
} | ||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,6 +7,8 @@ import android.view.LayoutInflater | |
import android.view.View | ||
import android.view.ViewGroup | ||
import com.droidcba.kedditbysteps.R | ||
import com.droidcba.kedditbysteps.commons.InfiniteScrollListener | ||
import com.droidcba.kedditbysteps.commons.RedditNews | ||
import com.droidcba.kedditbysteps.commons.RxBaseFragment | ||
import com.droidcba.kedditbysteps.commons.extensions.inflate | ||
import com.droidcba.kedditbysteps.features.news.adapter.NewsAdapter | ||
|
@@ -15,6 +17,7 @@ import rx.schedulers.Schedulers | |
|
||
class NewsFragment : RxBaseFragment() { | ||
|
||
private var redditNews: RedditNews? = null | ||
private val newsManager by lazy { NewsManager() } | ||
|
||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { | ||
|
@@ -25,7 +28,10 @@ class NewsFragment : RxBaseFragment() { | |
super.onActivityCreated(savedInstanceState) | ||
|
||
news_list.setHasFixedSize(true) | ||
news_list.layoutManager = LinearLayoutManager(context) | ||
val linearLayout = LinearLayoutManager(context) | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
zlaela
|
||
news_list.layoutManager = linearLayout | ||
news_list.clearOnScrollListeners() | ||
news_list.addOnScrollListener(InfiniteScrollListener({ requestNews() }, linearLayout)) | ||
This comment has been minimized.
Sorry, something went wrong.
kevincianfarini
|
||
initAdapter() | ||
|
||
if (savedInstanceState == null) { | ||
|
@@ -34,11 +40,17 @@ class NewsFragment : RxBaseFragment() { | |
} | ||
|
||
private fun requestNews() { | ||
val subscription = newsManager.getNews() | ||
/** | ||
* first time will send empty string for after parameter. | ||
* Next time we will have redditNews set with the next page to | ||
* navigate with the after param. | ||
*/ | ||
val subscription = newsManager.getNews(redditNews?.after ?: "") | ||
.subscribeOn(Schedulers.io()) | ||
.subscribe ( | ||
{ retrievedNews -> | ||
(news_list.adapter as NewsAdapter).addNews(retrievedNews) | ||
redditNews = retrievedNews | ||
(news_list.adapter as NewsAdapter).addNews(retrievedNews.news) | ||
}, | ||
{ e -> | ||
Snackbar.make(news_list, e.message ?: "", Snackbar.LENGTH_LONG).show() | ||
|
Don't you have a bug with RecyclerView?
https://stackoverflow.com/questions/31759171/recyclerview-and-java-lang-indexoutofboundsexception-inconsistency-detected-in