RecyclerView
が1つあり、RecyclerView
にデータのリストを追加しました。最後のRecyclerView
アイテムが画面に表示されるときに、リストにさらにデータを追加したかった。その後、Webサービスを呼び出してRecyclerView
データを更新します。どうすればこれを達成できますか?
助言がありますか?
これを実現するにはいくつかの方法がありますが、1つの方法は、アダプターのonBindViewHolder
メソッドを使用することです。
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (position == mData.length - 1) {
// load more data here.
}
/// binding logic
}
データソースの最後の位置でbindメソッドが呼び出された場合、これは最後のセルが表示されようとしていることを示しており、リロードコールをトリガーする良いタイミングです。まだ追加のデータをロードしていないことを確認するために、条件に追加のセーフガードを追加する必要があるかもしれませんが、これは開始するのに役立つはずです。
別のオプションには、LayoutManager
の編集が含まれます。ここでのアイデアは、最後に表示されるアイテムの位置を見つけることです。その位置がデータセットの最後のアイテムと等しい場合、リロードをトリガーする必要があります。この呼び出しはLayourManager's
onLayoutChildren
&scrollVerticallyBy
(垂直スクロールを使用する場合)メソッド:
@Override
public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
final int result = super.scrollVerticallyBy(dy, recycler, state);
if (findLastVisibleItemPosition() == mData.length - 1) {
loadMoreData();
}
return result;
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
super.onLayoutChildren(recycler, state);
if (findLastVisibleItemPosition() == mData.length - 1) {
loadMoreData();
}
}
前と同じように、データの読み込みを複数回トリガーしないようにする必要があります。この条件は複数回発生する可能性があるためです。
お役に立てれば!
誰かがこの投稿を偶然見つけた場合 これは 簡単で簡単なチュートリアル:
あなたがする必要があるのは:
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) {
super.onScrolled(recyclerView, dx, dy);
int visibleItemCount = lm.getChildCount();
int totalItemCount = lm.getItemCount();
int firstVisibleItemPosition= lm.findFirstVisibleItemPosition();
// Load more if we have reach the end to the recyclerView
if ( (visibleItemCount + firstVisibleItemPosition) >= totalItemCount && firstVisibleItemPosition >= 0) {
loadMoreItems();
}
}
});
次に、loadMoreItems()は次のようになります。
private void loadMoreItems() {
// init offset=0 the frist time and increase the offset + the PAGE_SIZE when loading more items
queryOffset = queryOffset + PAGE_SIZE;
// HERE YOU LOAD the next batch of items
List<Items> newItems = loadItems(queryOffset, PAGE_SIZE);
if (newItems.size() > 0) {
items.addAll(newItems);
adapter.notifyDataSetChanged();
}
}