2017-02-10 98 views
0

我試圖在android中實現Firebase,在這方面我有幾個疑問,如果你能幫助我解決這個問題,我會很高興。有點困惑。所以這是我的問題。Firebase分頁limitToFirst()vs limitToLast()

我在listview中顯示Firebase聊天,其中我只想從Firebase加載前100條消息,之後用戶將執行pull-to-refresh,然後加載前200條消息等。

enter image description here

對於我期待在limitToFirst()limitToLast()沒有得到主意哪一個更好。

任何人都可以請幫忙。

+0

@Frank van Puffelen我想問你的答案,這對我來說真的很珍貴。 – Gattsu

+0

@Maveň感謝賞金,我現在得到了正確的答案。 – Gattsu

回答

-3

這是兩者之間的比較。兩者都可以完成這項任務,這取決於你將來如何看待它。

Firebase reference documentation

limitToFirst

生成一個新的Query限於兒童的第一特定號碼。

limitToFirst()方法用於設置給定回調的最大同步子數。如果我們設置了100的限制,我們最初只會收到最多100個child_added事件。如果我們的數據庫中存儲的消息少於100條,則每條消息都會觸發一個child_added事件。但是,如果我們有超過100條消息,則我們只會收到前100條有序消息的child_added事件。隨着項目的變化,我們將在收到child_removed事件是跌出活動列表中的每個項目,以便limitToLast總數保持在100

生成限制到最後具體數量新Query對象孩子的。

limitToLast()方法用於爲給定回調設置要同步的最大子數。如果我們設置了100的限制,我們最初只會收到最多100個child_added事件。如果我們的數據庫中存儲的消息少於100條,則每條消息都會觸發一個child_added事件。但是,如果我們有超過100封郵件,我們只會收到最後100封有序郵件的child_added事件。隨着項目的變化,我們將收到退出活動列表的每個項目的child_removed事件,以便總數保持在100。

在你的類(我認爲是一種活動),創建Query類的成員變量:

private Query queryChat; 

onStart方法

3

我這樣做幾乎同樣的事情,開始做查詢:

@Override 
public void onStart() { 
    super.onStart(); 

    // initialize your value event listener 

    queryChat= mFirebaseDatabaseReference. 
      .orderByChild("timestamp") 
      .limitToLast(pageSize); 
    queryChat.addListenerForSingleValueEvent(yourValueEventListener); 

} 

pageSizeint變量,這裏必須設置爲100.

以這種方式做,您首先進行消息的升序(因此,生成的有序列表中的第一條消息是最早的),然後您選擇最後的pageSize消息(因此,按照時間順序排列最後的pageSize)。所以,你會得到第一個(按時間順序,從最新的)pageSize消息。

我想你已經在這裏實施了ValueEventListener。另外,timestamp是Firebase消息中的字段,其中存儲了以毫秒爲單位的消息的時間戳。

現在,在類中定義的方法是這樣的:

private void loadMoreItems() { 

    queryChat= mFirebaseDatabaseReference. 
      .orderByChild("timestamp") 
      .endAt(messageList.get(messageList.size()-1).getTimestamp()) 
      .limitToLast(pageSize); 
    queryChat.addListenerForSingleValueEvent(yourValueEventListener); 
} 

這裏的messageList是存儲聊天消息一個ArrayList,並充滿了ValueEventListener裏面,當你從火力得到的消息。

在這裏,我要告訴給火力做升序(如前),但只選擇與時間戳<這些項目=最後一個項目已經對用戶可見。(.endAt(messageList.get(messageList.size()-1).getTimestamp())告訴給火力點正是這一點),最後像以前一樣limitToLast

現在你可以隨時調用這個方法(loadMoreItems)(在你的情況下,當用戶確實拉動刷新)。

+0

感謝您的回答,我想加載最新的100條消息,然後如果用戶拉動刷新負載200條最新的消息等,哪一個最適合這種情況。 – Gattsu

+0

你的意思是「哪一個最適合這種情況」? –

+0

@瓦倫蒂諾我想琢磨哪一個用於我的情況? – Gattsu

1

你可以試試這個方法:

int mPageEndOffset = 0; 
int mPageLimit = 10; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
    connectDetector = new ConnectDetector(getActivity()); 
    if(connectDetector.getConnection()) { 

     alanRef = new Firebase(firebaseURL).child(EventChatActivity.SuperCateName + "/ " + eventDetail.getCategory_name() + "/ " + eventDetail.getEvent_title() + "/ " + EventChatActivity.eventID).child("StadiumChat"); 
     alanQuery = alanRef.limitToFirst(mPageLimit); 
     userName = MyApp.preferences.getString(MyApp.USER_NAME, null); 

     EventChatActivity.eventID).child("StadiumChat"); 
    } 
}  

這將從火力獲取最新10條信息的記錄。