Существует множество ресурсов для разбивки на страницы данных о пожарных хранилищах в Интернете, и существует множество решений, которые показывают, как разбивать на страницы с помощью индикатора выполнения, хотя и с фиктивными данными. Я объединил решения и это работает для начальной нагрузки. Тем не менее, я также предлагаю функцию поиска, где результаты могут иметь размер 1 или 0, а затем мое приложение вылетает. Вот трассировка стека:
java.lang.ArrayIndexOutOfBoundsException: length=0; index=-1
at java.util.ArrayList.remove(ArrayList.java:480)
at com.driptosinha.eataway.eataway.ui.RestaurantFragment.lambda$null$2$RestaurantFragment(RestaurantFragment.java:185)
at com.driptosinha.eataway.eataway.ui.-$$Lambda$RestaurantFragment$h-xqTU3GgDPxcQv64qmcgUx6Xgo.onComplete(lambda)
at com.google.android.gms.tasks.zzj.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Это происходит в следующем коде именно там, где я удаляю ноль / индикатор выполнения, так как загружаю больше данных, т.е. restaurantItemsArrayList.remove (restaurantItemsArrayList.size () - 1);
private void listRestaurants(final Query restaurantQuery) {
restaurantItemsArrayList = new ArrayList<>();
restaurantRecycler = restaurantView.findViewById(R.id.restaurant_recycler);
restaurantRecycler.setHasFixedSize(true);
restaurantRecycler.setLayoutManager(new WrapLinearLayoutManager(restaurantContext, LinearLayoutManager.VERTICAL, false));
restaurantQuery.limit(LOAD_LIMIT).get().addOnCompleteListener(task -> {
if (task.isSuccessful()) {
restaurantItemsArrayList = new ArrayList<>();
for (DocumentSnapshot document : task.getResult()) {
RestaurantItems restaurantItems = document.toObject(RestaurantItems.class);
restaurantItemsArrayList.add(restaurantItems);
}
restaurantDeliveryAdapter = new RestaurantDeliveryAdapter(restaurantRecycler, restaurantContext, restaurantItemsArrayList);
restaurantRecycler.setAdapter(restaurantDeliveryAdapter);
if(task.getResult().size() > 0) {
lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
}
restaurantDeliveryAdapter.setRestaurantAdapterListener((restaurantId, restaurantName, restaurantAddress) -> {
bundle.putString("restaurantId", restaurantId);
bundle.putString("restaurantName", restaurantName);
bundle.putString("restaurantAddress", restaurantAddress);
bundle.putBoolean("direction", true);
onButtonPressed(bundle);
});
restaurantDeliveryAdapter.setLoadMore(() -> {
restaurantItemsArrayList.add(null);
restaurantDeliveryAdapter.notifyItemInserted(restaurantItemsArrayList.size() - 1);
restaurantQuery.startAfter(lastVisible).limit(LOAD_LIMIT).get().addOnCompleteListener(task1 -> {
restaurantItemsArrayList.remove(restaurantItemsArrayList.size() - 1);
restaurantDeliveryAdapter.notifyItemRemoved(restaurantItemsArrayList.size());
for (DocumentSnapshot documentSnapshot : task1.getResult()) {
RestaurantItems restaurantItems = documentSnapshot.toObject(RestaurantItems.class);
restaurantItemsArrayList.add(restaurantItems);
restaurantDeliveryAdapter.notifyItemInserted(restaurantItemsArrayList.size());
}
restaurantDeliveryAdapter.setLoaded();
restaurantDeliveryAdapter.notifyDataSetChanged();
if(task1.getResult().size() > 0) {
lastVisible = task1.getResult().getDocuments().get(task1.getResult().size() - 1);
}
restaurantDeliveryAdapter.setRestaurantAdapterListener((restaurantId, restaurantName, restaurantAddress) -> {
bundle.putString("restaurantId", restaurantId);
bundle.putString("restaurantName", restaurantName);
bundle.putString("restaurantAddress", restaurantAddress);
bundle.putBoolean("direction", true);
onButtonPressed(bundle);
});
});
});
}
}).addOnFailureListener(e -> Log.d(TAG, "query error:"+e.getMessage()));
}
Теперь я могу проверить, равен ли индекс -1, а затем пропустить его, но затем я получаю его феномен, где между индикаторами рециркулятора появляется индикатор выполнения. Для справки вот адаптер:
public class RestaurantDeliveryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private Context adapterContext;
private RestaurantAdapterListener restaurantAdapterListener;
private ArrayList<RestaurantItems> restaurantItemsArrayList;
private final int VIEW_RESTAURANT = 0, VIEW_LOADING = 1;
private LoadMore loadMore;
private boolean isLoading;
private int visibleThreshold = 5;
private int totalItemCount, lastVisibleItem;
public RestaurantDeliveryAdapter(RecyclerView restaurantRecyclerView, Context adapterContext, ArrayList<RestaurantItems> restaurantItemsArrayList) {
this.adapterContext = adapterContext;
this.restaurantItemsArrayList = restaurantItemsArrayList;
if (restaurantRecyclerView.getLayoutManager() instanceof LinearLayoutManager) {
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) restaurantRecyclerView.getLayoutManager();
restaurantRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
totalItemCount = linearLayoutManager.getItemCount();
lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
if (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
if (loadMore != null) {
loadMore.onLoadMore();
}
isLoading = true;
}
}
});
}
}
@Override
public int getItemViewType(int position) {
return restaurantItemsArrayList.get(position) == null ? VIEW_LOADING : VIEW_RESTAURANT;
}
public void setLoadMore(LoadMore loadMore) {
this.loadMore = loadMore;
}
// Define listener to send chosen restaurant
public interface RestaurantAdapterListener {
//void onRestaurantSend(DocumentSnapshot documentSnapshot, int position);
void onRestaurantSend(String restaurantId, String restaurantName, String restaurantAddress);
}
// Set the listener. Must be called from the fragment
public void setRestaurantAdapterListener(RestaurantAdapterListener restaurantAdapterListener) {
this.restaurantAdapterListener = restaurantAdapterListener;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
if (viewType == VIEW_LOADING) {
View view = LayoutInflater.from(adapterContext).inflate(R.layout.item_progressbar, viewGroup,false);
return new LoadingViewHolder(view);
} else if (viewType == VIEW_RESTAURANT) {
View view = LayoutInflater.from(adapterContext).inflate(R.layout.item_restaurant_delivery, viewGroup,false);
return new RestaurantViewHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int i) {
if (viewHolder instanceof RestaurantViewHolder) {
((RestaurantViewHolder)viewHolder).tvRestaurantName.setText(restaurantItemsArrayList.get(i).getRestaurantName());
((RestaurantViewHolder)viewHolder).tvRestaurantAddress.setText(restaurantItemsArrayList.get(i).getRestaurantAddress());
((RestaurantViewHolder)viewHolder).tvRestaurantDescription.setText(restaurantItemsArrayList.get(i).getRestaurantDescription());
Glide.with(adapterContext).load(restaurantItemsArrayList.get(i).getRestaurantLogo()).into(((RestaurantViewHolder) viewHolder).tvRestaurantLogo);
((RestaurantViewHolder)viewHolder).btnMenuCard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
restaurantAdapterListener.onRestaurantSend(restaurantItemsArrayList.get(i).getRestaurantId(), restaurantItemsArrayList.get(i).getRestaurantName(), restaurantItemsArrayList.get(i).getRestaurantAddress());
}
});
} else if (viewHolder instanceof LoadingViewHolder) {
((LoadingViewHolder)viewHolder).progressBar.setIndeterminate(true);
}
}
@Override
public int getItemCount() {
return restaurantItemsArrayList.size();
}
class RestaurantViewHolder extends RecyclerView.ViewHolder {
public TextView tvRestaurantName, tvRestaurantAddress, tvRestaurantDescription, btnMenuCard;
public ImageView tvRestaurantLogo;
//public String restaurantId;
public RestaurantViewHolder(@NonNull View itemView) {
super(itemView);
tvRestaurantName = itemView.findViewById(R.id.restaurant_name);
tvRestaurantAddress = itemView.findViewById(R.id.restaurant_address);
tvRestaurantDescription = itemView.findViewById(R.id.restaurant_description);
tvRestaurantLogo = itemView.findViewById(R.id.restaurant_logo);
btnMenuCard = itemView.findViewById(R.id.button_see_menu);
}
}
class LoadingViewHolder extends RecyclerView.ViewHolder {
public ProgressBar progressBar;
public LoadingViewHolder(@NonNull View itemView) {
super(itemView);
progressBar = itemView.findViewById(R.id.restaurant_progress_bar);
}
}
public void setLoaded() {
isLoading = false;
}
}