Пагинация облачного пожарного магазина в Android - повторяющиеся результаты - PullRequest
0 голосов
/ 29 октября 2018

Как разбить Firestore на Android?
https://www.youtube.com/watch?v=KdgKvLll07s&t=413s
Я использую способ, как упомянуто выше, для создания облачной Firestore Pagination в Android. Решение, которое предоставил Алекс Мамо. При использовании я столкнулся с проблемой: если я прокручиваю пальцем, удерживая позицию последнего элемента, возможно дублировать элемент дважды, он загружается дважды, у кого-нибудь есть идеи, чтобы решить эту проблему?
Я считаю, что в методе onScrolled возникла следующая проблема:

query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
    if (task.isSuccessful()) {
        List<ProductModel> list = new ArrayList<>();
        for (DocumentSnapshot document : task.getResult()) {
            ProductModel productModel = document.toObject(ProductModel.class);
            list.add(productModel);
        }
        ProductAdapter productAdapter = new ProductAdapter(list);
        recyclerView.setAdapter(productAdapter);
        lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);

        RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                    isScrolling = true;
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                LinearLayoutManager linearLayoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager());
                int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
                int visibleItemCount = linearLayoutManager.getChildCount();
                int totalItemCount = linearLayoutManager.getItemCount();

                if (isScrolling && (firstVisibleItemPosition + visibleItemCount == totalItemCount) && !isLastItemReached) {
                    isScrolling = false;
                    Query nextQuery = productsRef.orderBy("productName", Query.Direction.ASCENDING).startAfter(lastVisible).limit(limit);
                    nextQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> t) {
                            if (t.isSuccessful()) {
                                for (DocumentSnapshot d : t.getResult()) {
                                    ProductModel productModel = d.toObject(ProductModel.class);
                                    list.add(productModel);
                                }
                                productAdapter.notifyDataSetChanged();
                                lastVisible = t.getResult().getDocuments().get(t.getResult().size() - 1);

                                if (t.getResult().size() < limit) {
                                    isLastItemReached = true;
                                }
                            }
                        }
                    });
                }
            }
        };
        recyclerView.addOnScrollListener(onScrollListener);
    }
}});


Ниже приведены другие файлы, связанные с Alex Mamo:

ProductModel

public class ProductModel {
    private String productName;

    public ProductModel() {}

    public ProductModel(String productName) {this.productName = productName;}

    public String getProductName() {return productName;}
}

Адаптер

private class ProductAdapter extends RecyclerView.Adapter<ProductViewHolder> {
    private List<ProductModel> list;

    ProductAdapter(List<ProductModel> list) {
        this.list = list;
    }

    @NonNull
    @Override
    public ProductViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_product, parent, false);
        return new ProductViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ProductViewHolder productViewHolder, int position) {
        String productName = list.get(position).getProductName();
        productViewHolder.setProductName(productName);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
    private class ProductViewHolder extends RecyclerView.ViewHolder {
        private View view;

        ProductViewHolder(View itemView) {
            super(itemView);
            view = itemView;
        }

        void setProductName(String productName) {
            TextView textView = view.findViewById(R.id.text_view);
            textView.setText(productName);
        }
    }

}

Это только часть кодов, для полной версии перейдите по ссылкам выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...