Firebase 无限滚动列表视图在滚动时加载 10 个项目

Firebase infinite scroll list view Load 10 items on Scrolling

我正在寻找一种方法来在我的 Firebase 应用程序中实现简单的列表视图滚动,但我不知道如何实现它。我已经尝试了 2-3 个教程和 Internet 上可用的文档,但没有得到所需的结果。

在我的应用程序中,我希望在开始加载前 10 个列表项时进行滚动,然后每次滚动都会加载接下来的 10 或 20 个项目,直到最后一个项目出现在列表底部。

所以我尝试通过以下方式检索前 10 项:

ArrayList<Event> event=new ArrayList<>();

Dbref = FirebaseDatabase.getInstance().getReference("/event");
Dbref.startAt(1).limitToLast(10).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                Log.e("Events.java ", "range query started! : " + dataSnapshot.getChildrenCount());
                String event_id = snapshot.child("details").child("event_id").getValue().toString();
                e=new Event(event_id); //Event is a model class for list items
                event.add(e);
                Log.e("ShowEventInfo : ", "" + event_id);
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    adapter=new Event_CustomAdapter(getActivity(),event); 
    ls.setAdapter(adapter); //here ls is instance of ListView

我引用了这个 Youtube 视频来实现此功能: (https://www.youtube.com/watch?annotation_id=annotation_3916642001&feature=iv&src_vid=YMJSBHAZsso&v=XwIKb_f0Y_w)

在上面的代码中,如您所见,我正在生成日志以检查是否从 firebase 获取数据,但我没有输出 Android 监视器。

我不知道如何在我的列表视图中实现 Firebase 滚动。我认为对于那些在回收器视图/列表视图中实现无限滚动的人来说,这是一个常见的问题。

你能帮我实现这个功能吗?谢谢

这里我们将使用 DatabaseReference;s 方法 limitToFirst(int)limitToLast(int)FireBase.
中获取第一条或最后一条记录

在下面的示例中,我使用 limitToFirst(int) 仅从 Firebase 获取指定的最高记录。我在这里玩 oldestPostId 这是我们记录的最后一个或 10th 键。

  private String oldestPostId;
  DatabaseReference Dbref = FirebaseDatabase.getInstance().getReference("/event");


  /////GETTING FIRST 10 RECORDS FROM THE FIREBASE HERE

        Dbref.limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot child : dataSnapshot.getChildren()) {

                    oldestPostId = child.getKey(); ////HERE WE ARE SAVING THE LAST POST_ID FROM URS POST

                    dataSnapshot.getChildrenCount());
                    String event_id = snapshot.child("details").child("event_id").getValue().toString();
                    e=new Event(event_id); //Event is a model class for list items
                    event.add(e);
                    Log.e("ShowEventInfo : ", "" + event_id);
                }      
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

从上面的代码中,我已经从 firebase 获得了前 10 条记录,现在我们将实现加载更多功能,所以我正在使用 ListviewonscrolllistenerisScrollCompleted() 上,我们将使用 orderByKey() 通过 limitToFirst() 方法进一步获取 10 条记录。我已经实现了整个代码以获取有关 isScrollCompleted() 的更多数据,请查看以下示例。

YOUR_LISTVIEW.setOnScrollListener(new OnScrollListener() {
    private int currentVisibleItemCount;
    private int currentScrollState;
    private int currentFirstVisibleItem;
    private int totalItem;
    private LinearLayout lBelow;


    @Override
    public void onScrollStateChanged (AbsListView view,int scrollState){
        // TODO Auto-generated method stub
        this.currentScrollState = scrollState;
        this.isScrollCompleted();
    }

    @Override
    public void onScroll (AbsListView view,int firstVisibleItem,
    int visibleItemCount, int totalItemCount){
        // TODO Auto-generated method stub
        this.currentFirstVisibleItem = firstVisibleItem;
        this.currentVisibleItemCount = visibleItemCount;
        this.totalItem = totalItemCount;


    }

    private void isScrollCompleted () {
        if (totalItem - currentFirstVisibleItem == currentVisibleItemCount
                && this.currentScrollState == SCROLL_STATE_IDLE) {
            /** To do code here*/
            Dbref.orderByKey().startAt(oldestPostId).limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot child : dataSnapshot.getChildren()) {

                        oldestPostId = child.getKey();
                        String event_id = snapshot.child("details").child("event_id").getValue().toString();
                        e = new Event(event_id); //Event is a model class for list items
                        event.add(e);
                        Log.e("ShowEventInfo : ", "" + event_id);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }
    });

});