Android Firebase分页limitToFirst()与limitToLast()的比较
我试图在安卓系统中实现Firebase,对此我有一些疑问,如果您能帮助我,我将非常高兴。有点糊涂了。这是我的问题 我在Android Firebase分页limitToFirst()与limitToLast()的比较,android,firebase,pagination,firebase-realtime-database,Android,Firebase,Pagination,Firebase Realtime Database,我试图在安卓系统中实现Firebase,对此我有一些疑问,如果您能帮助我,我将非常高兴。有点糊涂了。这是我的问题 我在listview中显示Firebase聊天,在用户执行pull刷新后,我只想从Firebase加载前100条消息,然后加载前200条消息,依此类推 为此,我在查看limitToFirst()和limitToLast()中,不知道哪一个更好 任何人都可以帮忙。我用这种方式做了几乎相同的事情: int mPageEndOffset = 0; int mPageLimit = 10;
listview
中显示Firebase聊天,在用户执行pull刷新后,我只想从Firebase加载前100条消息,然后加载前200条消息,依此类推
为此,我在查看limitToFirst()
和limitToLast()
中,不知道哪一个更好
任何人都可以帮忙。我用这种方式做了几乎相同的事情:
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");
}
}
在类中(我假设这是一个活动),创建Query
类型的成员变量:
private Query queryChat;
在onStart
方法中,开始执行查询:
@Override
public void onStart() {
super.onStart();
// initialize your value event listener
queryChat= mFirebaseDatabaseReference.
.orderByChild("timestamp")
.limitToLast(pageSize);
queryChat.addListenerForSingleValueEvent(yourValueEventListener);
}
pageSize
是一个int
变量,这里必须设置为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,当您从firebase获取消息时,它会填充在ValueEventListener中
在这里,我告诉firebase按升序(和以前一样),但只选择带有时间戳的项目我用这种方式做了几乎相同的事情:
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");
}
}
在类中(我假设这是一个活动),创建Query
类型的成员变量:
private Query queryChat;
在onStart
方法中,开始执行查询:
@Override
public void onStart() {
super.onStart();
// initialize your value event listener
queryChat= mFirebaseDatabaseReference.
.orderByChild("timestamp")
.limitToLast(pageSize);
queryChat.addListenerForSingleValueEvent(yourValueEventListener);
}
pageSize
是一个int
变量,这里必须设置为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,当您从firebase获取消息时,它会填充在ValueEventListener中
在这里,我告诉firebase按升序(如前所述),但只选择带有时间戳的项目,您可以这样尝试:
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");
}
}
这将从firebase获取最近10条消息的记录。您可以尝试以下方法:
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");
}
}
这将从firebase获取最新10条消息的记录。谢谢您的回答,我想加载最新的100条消息,然后如果用户拉刷新加载200条最新消息等等,那么哪一条最适合这种情况。您所说的“哪一条最适合这种情况”是什么意思?@Valentino我想知道在我的案例中使用哪一个?这取决于你如何订购orderByChild。正如您在这个答案中所看到的,将limitToLast与orderByChild和endAtHi结合使用非常简单,@valentinoS。我试着按照你的建议做,但我总是得到同样的东西。。。我在新的线程中键入了我的问题。你会来帮助我的。谢谢你的回答,我想加载最新的100条消息,然后如果用户拉刷新加载200条最新消息等等,那么哪一条最适合这种情况。你说的“哪一条最适合这种情况”是什么意思?@Valentino我想知道在我的情况下使用哪一条?这取决于你如何订购orderByChild。正如您在这个答案中所看到的,将limitToLast与orderByChild和endAtHi结合使用非常简单,@valentinoS。我试着按照你的建议做,但我总是得到同样的东西。。。我在新的线程中键入了我的问题。你会来帮助我的@弗兰克·范·帕夫伦我希望你能回答这个问题,这对我来说非常宝贵。@Maveň谢谢你的赏金,我的朋友,我现在得到了一个正确的答案。@Frank van Puffelen我希望你能回答这个问题,这对我来说非常宝贵。@Maveň谢谢你的赏金,我的朋友,我现在得到了正确的答案。