私は1つ持っておりRecyclerView
、データのリストをに追加しましたRecyclerView
。RecyclerView
最後のアイテムが画面に表示されているときに、リストにデータを追加したかったのです。その後、Web サービスを呼び出してデータを更新したいと考えていRecyclerView
ます。どうすればこれを達成できますか?
助言がありますか?
私は1つ持っておりRecyclerView
、データのリストをに追加しましたRecyclerView
。RecyclerView
最後のアイテムが画面に表示されているときに、リストにデータを追加したかったのです。その後、Web サービスを呼び出してデータを更新したいと考えていRecyclerView
ます。どうすればこれを達成できますか?
助言がありますか?
1 つのオプションには、LayoutManager
. ここでの考え方は、最後に表示されたアイテムの位置を見つけることです。その位置がデータセットの最後のアイテムと等しい場合は、リロードをトリガーする必要があります。
@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();
}
}
別の方法として、アダプターのメソッドを使用してこれを行うこともできますがonBindViewHolder
、これは確かに少し「ハック」です。
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (position == mData.length - 1) {
// load more data here.
}
/// binding logic
}
3 番目のオプションは、OnScrollListener を RecyclerView に追加することです。このページの@velvalの回答は、これをよく説明しています。
どちらのオプションを使用する場合でも、データ ロード ロジックが何度もトリガーされるのを防ぐためのコードを含める必要があります (たとえば、より多くのデータを取得する前の要求が完了し、新しいデータが返される前)。
Android - RecyclerView の最後のアイテムが表示されたときに検出するも参照してください。
private fun isLastItemVisible(): Boolean {
val layoutManager = recycler_view.layoutManager
val position = layoutManager.findLastCompletelyVisibleItemPosition()
return position >= adapter.itemCount - 1
}