私はjsonに約32のレコードを持っています、私はそれらを表示するためにRecyclerViewを使用しており、OnScrollListener(...)を実装しました
質問
私はアクティビティを開始し、32レコードすべてをフェッチしました。スクロールすると、同じ32レコードを何度も何度も取得するのですが、スクロールするたびに、ここにOnScrollListener()の実装があります。
public void initializeOnScrollForRecyclerView() {
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
int visibleItemCount = recyclerView.getLayoutManager().getChildCount();
int totalItemCount = recyclerView.getLayoutManager().getItemCount();
int pastVisiblesItems = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
if (!isLoading) {
if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
isLoading = true;
mPostPresenter.loadPosts(false);
}
}
}
});
}
実装は正しいようですが、1つの条件が失敗した場合は、dy> 0のときに次のように試してください(これもアクティビティのOnCreateに入れます)。
private boolean loading = true;
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy)
{
if (loading) {
if (dy > 0) //check for scroll down
{
visibleItemCount = layoutManager.getChildCount();
totalItemCount = layoutManager.getItemCount();
pastVisiblesItems = layoutManager.findFirstVisibleItemPosition();
if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
loading = false;
Log.v("...", " Reached Last Item");
loadMoreVideos(searchVideos);
}
}
}
}
});
これを使用しています
if ((visibleItemCount + pastVisiblesItems) >= totalItemCount)
つまり、22件のレコードを表示すると、再度ロードすることになります。そして、再度ロードしている間、同じデータを取得してリストに追加しています。
RXjavaを使用していることがわかります。 loadPostでサブスクライブしているときに、オブザーバブルが出力しているデータを確認してください。私はそれが同じデータを再び放出すると思います、つまりあなたの32レコードとそれらのレコードが再び追加され、これは無限ループです。
最後のアイテムに達したときに何かをトリガーする別の方法を次に示します
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
//When last item is reached
if(position == yourList.size() - 1){
loadMoreMessages();
}
}
public abstract void loadMoreMessages();