Огонь с нумерацией страниц с прогрессбаром не работает - PullRequest
0 голосов
/ 09 июля 2019

Существует множество ресурсов для разбивки на страницы данных о пожарных хранилищах в Интернете, и существует множество решений, которые показывают, как разбивать на страницы с помощью индикатора выполнения, хотя и с фиктивными данными. Я объединил решения и это работает для начальной нагрузки. Тем не менее, я также предлагаю функцию поиска, где результаты могут иметь размер 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;
    }

}
...