Fix[ui]: disable the progressbar and stop loading at the end of the list

Also: move all array copies away from the UI thread
This commit is contained in:
artdeell 2023-08-19 22:33:55 +03:00 committed by ArtDev
parent d8b1fbf968
commit a276813230

View File

@ -54,6 +54,7 @@ public class ModItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
private Future<?> mTaskInProgress; private Future<?> mTaskInProgress;
private SearchFilters mSearchFilters; private SearchFilters mSearchFilters;
private SearchResult mCurrentResult; private SearchResult mCurrentResult;
private boolean mLastPage;
public ModItemAdapter(Resources resources, ModpackApi api, SearchResultCallback callback) { public ModItemAdapter(Resources resources, ModpackApi api, SearchResultCallback callback) {
@ -69,6 +70,7 @@ public class ModItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
mTaskInProgress = null; mTaskInProgress = null;
} }
this.mSearchFilters = searchFilters; this.mSearchFilters = searchFilters;
this.mLastPage = false;
mTaskInProgress = new SelfReferencingFuture(new SearchApiTask(mSearchFilters, null)) mTaskInProgress = new SelfReferencingFuture(new SearchApiTask(mSearchFilters, null))
.startOnExecutor(PojavApplication.sExecutorService); .startOnExecutor(PojavApplication.sExecutorService);
} }
@ -108,7 +110,7 @@ public class ModItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
@Override @Override
public int getItemCount() { public int getItemCount() {
if(mModItems.length == 0) return 0; if(mLastPage || mModItems.length == 0) return mModItems.length;
return mModItems.length+1; return mModItems.length+1;
} }
@ -331,36 +333,44 @@ public class ModItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
public void run(Future<?> myFuture) { public void run(Future<?> myFuture) {
SearchResult result = mModpackApi.searchMod(mSearchFilters, mPreviousResult); SearchResult result = mModpackApi.searchMod(mSearchFilters, mPreviousResult);
ModItem[] resultModItems = result != null ? result.results : null; ModItem[] resultModItems = result != null ? result.results : null;
if(resultModItems != null && resultModItems.length != 0 && mPreviousResult != null) {
ModItem[] newModItems = new ModItem[resultModItems.length + mModItems.length];
System.arraycopy(mModItems, 0, newModItems, 0, mModItems.length);
System.arraycopy(resultModItems, 0, newModItems, mModItems.length, resultModItems.length);
resultModItems = newModItems;
}
ModItem[] finalModItems = resultModItems;
Tools.runOnUiThread(() -> { Tools.runOnUiThread(() -> {
if(myFuture.isCancelled()) return; if(myFuture.isCancelled()) return;
mTaskInProgress = null;
if(resultModItems == null) { if(finalModItems == null) {
mSearchResultCallback.onSearchError(SearchResultCallback.ERROR_INTERNAL); mSearchResultCallback.onSearchError(SearchResultCallback.ERROR_INTERNAL);
}else if(resultModItems.length == 0) { }else if(finalModItems.length == 0) {
if(mPreviousResult != null) {
mLastPage = true;
notifyItemChanged(mModItems.length);
mSearchResultCallback.onSearchFinished();
return;
}
mSearchResultCallback.onSearchError(SearchResultCallback.ERROR_NO_RESULTS); mSearchResultCallback.onSearchError(SearchResultCallback.ERROR_NO_RESULTS);
}else{ }else{
mSearchResultCallback.onSearchFinished(); mSearchResultCallback.onSearchFinished();
} }
mCurrentResult = result; mCurrentResult = result;
if(resultModItems == null) { if(finalModItems == null) {
mModItems = MOD_ITEMS_EMPTY; mModItems = MOD_ITEMS_EMPTY;
mTaskInProgress = null;
notifyDataSetChanged(); notifyDataSetChanged();
return; return;
} }
if(mPreviousResult != null) { if(mPreviousResult != null) {
ModItem[] newModItems = new ModItem[resultModItems.length + mModItems.length]; int prevLength = mModItems.length;
System.arraycopy(mModItems, 0, newModItems, 0, mModItems.length); mModItems = finalModItems;
System.arraycopy(resultModItems, 0, newModItems, mModItems.length, resultModItems.length); notifyItemChanged(prevLength);
mModItems = newModItems; notifyItemRangeInserted(prevLength+1, mModItems.length);
mTaskInProgress = null; }else {
notifyItemChanged(mModItems.length); mModItems = finalModItems;
notifyItemRangeInserted(mModItems.length+1, newModItems.length);
return;
}
mModItems = resultModItems;
mTaskInProgress = null;
notifyDataSetChanged(); notifyDataSetChanged();
}
}); });
} }
} }