3

我正在尋找一種方法來實現在我的Firebase應用程序中滾動的簡單列表視圖,但我無法解決如何實現此目的。我已經在互聯網上嘗試了2-3個教程和文檔,但沒有得到所需的結果。Firebase無限滾動列表視圖在滾動上加載10個項目

在我的應用程序中,我想滾動像開始前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滾動。我認爲這對於那些在回收視圖/列表視圖中實現無限滾動的人來說是一個常見問題。

請幫我實施此功能。謝謝。

+0

不,你提到的鏈接是解釋刷新更新數據,但我想更新我的滾動列表視圖,所以現在你可以刪除重複的標籤,因爲我非常需要這個答案問題。 @RavindraKushwaha –

+0

請檢查我的問題和他們的答案..我會不忠的擺脫這個問題..他們在我的問題和urs沒有什麼區別...在列表/ recyclview你需要調用該函數,使urs更多數據.. –

+0

其實我已經通過你的鏈接之前發佈這個問題在這裏,但我沒有覺得它有用,但如果你想幫助你能告訴我我怎麼可以在listview onScrollListener中使用你的方法,因爲那就是我想要的 –

回答

5

在這裏,我們將使用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) { 

      } 
     }); 

從上面的代碼中,我已接到火力點前10個記錄,現在我們將所以我用了ListviewonscrolllistenerisScrollCompleted(),我們將使用orderByKey()爲獲得另外10多個記錄實現負載更多的功能用limitToFirst()方法。我已經實施了整個代碼以獲得更多的數據,請查看以下示例。

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) { 

    } 
    }); 

    } 
    }); 

    }); 
+0

感謝您的幫助,但我已經解決了它。雖然它與我所做的相似!再次感謝! :) –

+0

現在你可以請刪除重複的標誌.... –

+0

@AnujKumar刪除...快樂編碼.. :) –