Ответ 1
Благодаря этой теме мне удалось определить, достаточно ли повторного просмотра для прокрутки: Как узнать, есть ли у RecyclerView достаточно контента для прокрутки?
Затем я немного сыграл с кодом и, похоже, работает таким образом.
Я создаю две новые переменные:
final static String PROGRESS_BAR = "progressBar"; //this will be the unique object that will be added to the arraylist when you want to display the progress bar
boolean progressBarAdded; //the progressbar must only be added once so this will keep track of it when it is added.
//adapter code is changed to take into account when the recyclerview can/cannot scroll
mAdapter.setOnLoadMoreListener(new MyAdapter.OnLoadMoreListener() {
@Override
public void onLoadMore() {
//add progress item
//we can scroll and progress bar is not yet added
if (!progressBarAdded && llm.findLastCompletelyVisibleItemPosition() != mAdapter.getItemCount() - 1) {
progressBarAdded = true;
myDataset.add(PROGRESS_BAR);
mAdapter.notifyItemInserted(myDataset.size() - 1);
}
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//remove progress item
boolean removed = myDataset.remove(PROGRESS_BAR);
if (removed) {
mAdapter.notifyItemRemoved(myDataset.size());
progressBarAdded = false; //progress bar is now removed
}
//add items one by one
for (int i = 0; i < 3; i++) {
myDataset.add("Item" + (myDataset.size() + 1));
mAdapter.notifyItemInserted(myDataset.size());
}
//we can scroll
if(llm.findLastCompletelyVisibleItemPosition()!=mAdapter.getItemCount()-1) {
mAdapter.setLoaded();
}
}
}, 500);
Затем меняем scrolllistener следующим образом:
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
totalItemCount = linearLayoutManager.getItemCount();
lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
if (totalItemCount <= (lastVisibleItem + visibleThreshold)) {
// End has been reached
// Do something
if (onLoadMoreListener != null) {
onLoadMoreListener.onLoadMore();
}
if (linearLayoutManager.findLastCompletelyVisibleItemPosition() != MyAdapter.this.getItemCount() - 1) { //determines whether the recyclerview is full or not. If not full, this will cause it to continue to load
loading = true;
}
}
}
});
}
Также убедитесь, что вы учитываете новый getItemType, поскольку каждый раз, когда он обнаруживает строку «progressBar», она должна загружать зрителя для progressBar:
@Override
public int getItemViewType(int position) {
return mDataset.get(position) != MainActivity.PROGRESS_BAR ? VIEW_ITEM : VIEW_PROG;
}