бесконечный просмотрщик не работает правильно - PullRequest
0 голосов
/ 23 июня 2018

Я делаю приложение для одежды, и мне нужно сделать бесконечное представление о переработчике. Я могу получить все данные, но не могу разбить на страницы, я испробовал много решений, но ничего не работает, это мой код для страницы и изображениядля базы данных пожарной базы данных переработчика.

Изображение для базы пожарных Image for the firebase

код:

private View mMainView;
private String user_id;
private RecyclerView mUserList;
private DatabaseReference mUserDatabase;
private List<ItemsRecyclerView> mItems;
private ItemsAdapter itemsAdapter;
private GridLayoutManager gridLayoutManager;
private String oldestkey;


public Items() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mMainView = inflater.inflate(R.layout.fragment_items, container, false);
    mUserList = (RecyclerView) mMainView.findViewById(R.id.items_recyclerview);

    mItems = new ArrayList<>();

    gridLayoutManager = new GridLayoutManager(getActivity(),3);
    mUserList.setLayoutManager(gridLayoutManager);
    mUserList.setHasFixedSize(true);
    mUserList.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            Boolean reachedBottom = !recyclerView.canScrollVertically(1);

            if (reachedBottom){
                loadMoreMessages();
            }
        }
    });

    itemsAdapter = new ItemsAdapter(mItems);

    ViewCompat.setNestedScrollingEnabled(mUserList, false);
    ProfileAdmin activity = (ProfileAdmin) getActivity();
    user_id = activity.getMyData();

    mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Items").child(user_id);

    mUserDatabase.keepSynced(true);

    loadItems();

    return mMainView;
}

private void loadMoreMessages() {
    mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Items").child(user_id);

    Query itemsRef = mUserDatabase.orderByKey().startAt(oldestkey).limitToLast(10);

    itemsRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            ItemsRecyclerView data = dataSnapshot.getValue(ItemsRecyclerView.class);

            oldestkey = dataSnapshot.getKey();

            mItems.add(data);

            itemsAdapter.notifyDataSetChanged();
            gridLayoutManager.scrollToPositionWithOffset(7,0);
        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

public void loadItems(){
    mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Items").child(user_id);
    Query query = mUserDatabase.orderByKey().limitToLast(10);

    query.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            ItemsRecyclerView data = dataSnapshot.getValue(ItemsRecyclerView.class);


            for (DataSnapshot child : dataSnapshot.getChildren()){
                oldestkey = child.getKey();

                itemsAdapter.notifyDataSetChanged();
                //now add the list
                mItems.add(data);
                //now add the adapter
                mUserList.setAdapter(itemsAdapter);
            }

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

Я надеюсь, что кто-то поймет меня и найдет решение этой проблемы.

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Я бы порекомендовал вам использовать эту библиотеку XRecyclerView , она поддерживает просмотр с верхней загрузкой и бесконечную переработку

xRecyclerView.setLoadingListener(this);
@Override
public void onRefresh() {

}

@Override
public void onLoadMore() {

}

для разбиения на страницы Firebase вы можете загрузить все данные одновременно и иметь два массива данных, содержащих данные List<Data> allData; и List<Data> adapterData;

допустим, вы покажете только 16 элементов на каждую загрузку, поэтому в вашем onLoadMore() method

lastIndex+=16;
adapterData.addAll(d.size()-1, allData.subList(lastIndex, lastIndex+16))

lastIndex - это переменная в вашем адаптере, сохраняющая последний загруженный индекс

0 голосов
/ 23 июня 2018

попробуйте использовать этот прослушиватель прокрутки с вашим переработчиком.

При загрузке большего количества элементов разместите свою логику для загрузки большего количества элементов

isLastPage вернет true, если нет элементов для загрузки

isLoading будет иметь значение true, когда вы извлекаете данные, и false, когда вы извлекаете данные.

  import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;

    /**
     * Pagination class to add more items to the list when reach the last item.
     */
    public abstract class PaginationScrollListener extends RecyclerView.OnScrollListener {

        LinearLayoutManager layoutManager;

        /**
         * Supporting only LinearLayoutManager for now.
         *
         * @param layoutManager
         */
        public PaginationScrollListener(LinearLayoutManager layoutManager) {
            this.layoutManager = layoutManager;
        }

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

            int visibleItemCount = layoutManager.getChildCount();
            int totalItemCount = layoutManager.getItemCount();
            int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();

            if (!isLoading() && !isLastPage()) {
                if (visibleItemCount + firstVisibleItemPosition >= totalItemCount
                        && firstVisibleItemPosition >= 0
    //                    && totalItemCount >= ClothesFragment.itemsCount
                        ) {
                    loadMoreItems();
                }
            }
        }

        protected abstract void loadMoreItems();

        public abstract boolean isLastPage();

        public abstract boolean isLoading();

    }

добавьте это в свой список повторных проверок

 public boolean isLastPage;
    public boolean isLoading;
 recyclerView.addOnScrollListener(new PaginationScrollListener(your layoutManager) {
            @Override
            protected void loadMoreItems() {
                isLoading=true;
                loadMoreItems();

            }

            @Override
            public boolean isLastPage() {
                return isLastPage;
            }

            @Override
            public boolean isLoading() {
                return isLoading;
            }
        });

   void loadMoreItems() {
        isLoading=false;

        after fetching your data assuming you have fetched list in your recyclerview
        adapter assuming your recyclerview adapter is rvAdapter
        rvAdapter.addData(list);
    }

Теперь в вашем адаптере представления повторных обращений добавьте следующий метод

Здесь список - это список, который направляет ваше мнение о переработчике

   void  addData(ArrayList<Object> list) {
            int size = this.list.size();
            this.list.addAll(list);
            int sizeNew = this.list.size();
            notifyItemRangeChanged(size, sizeNew);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...