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

5

我正在寻找一种在我的Firebase应用程序中实现简单列表视图滚动的方法,但是我没有找到如何实现这一点的途径。我已经尝试了2-3个可在互联网上找到的教程和文档,但没有得到所需的结果。

在我的应用程序中,我想要的滚动方式是:开始时加载前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滚动。我认为这是那些在RecyclerView/ListView中实现无限滚动的人普遍面临的问题。
请帮助我实现这个功能。谢谢。

不是的,你提到的链接是解释如何在下拉刷新时更新数据,但我想要在滚动时更新我的列表视图,所以现在你能否请删除重复的标签,因为我非常需要这个问题的答案。@RavindraKushwaha - Anuj Kumar
请检查我的问题和它们的答案。你会摆脱这个问题的不忠。我的问题和你的没有区别。在列表/回收视图的滚动中,您需要调用该函数,以获取更多数据。 - Ravindra Kushwaha
实际上,在我发布这个问题之前,我已经查看了您的链接,但我没有发现它有用。但如果您想帮忙,您能告诉我如何在listview onScrollListener中使用您的方法吗?因为那正是我想要的。 - Anuj Kumar
肯定会在一段时间后回答你的问题。但我的主要关注点是,你没有从那段代码中尝试理解。同样的解决方案也适用于你。所以请尝试一下。如果你仍然无法得到任何东西,我就准备好帮助你了。我在这里是来帮助你的,而不是标记任何问题为重复的:P - Ravindra Kushwaha
没问题。在今天结束前,我会发布答案。 - Ravindra Kushwaha
显示剩余2条评论
1个回答

13

在这里,我们将使用DatabaseReference的方法,即limitToFirst(int)limitToLast(int)来从FireBase获取第一条或最后一条记录。

在以下示例中,我正在使用limitToFirst(int)仅从Firebase中获取指定数量的记录。在这里,我正在处理oldestPostId,它是我们记录中的最后一个或第10个键。

  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条记录。现在我们将实现加载更多功能,因此我正在使用Listviewonscrolllistener。 在isScrollCompleted()中,我们将使用orderByKey()来获取更多的10条记录,并使用limitToFirst()方法。我已经实现了整个代码以在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) {

                }
            });

        }
    });

});

谢谢您的帮助,但我已经解决了。虽然它与我所做的相似!!再次感谢! :) - Anuj Kumar
现在,您可以请移除重复标志... - Anuj Kumar
@AnujKumar已删除...祝你编程愉快.. :) - Ravindra Kushwaha
2
非常感谢,它运行得非常好。 - Mahtab
1
非常感谢您! - Gastón Saillén
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接