gpt4 book ai didi

android - 从 firebase 读取数据,并填充到 ListView 中

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:15 25 4
gpt4 key购买 nike

我正在开发一个应用程序,我想在其中从我的 firebase 数据库中读取数据,并将其放入我的 listView 中。

我想要 3 种不同的读取操作。

  1. 应用首次启动时,我想读取最近的 10 行。

  2. 当我到达 listView 的末尾时,我想再获取 10 行,从目前已读取的最旧行开始。

  3. 当我拉到 listView 的顶部时,我想获取在现在显示为第一行的行之后创建的所有行。 (这样可以理解吗……?)

注意:当我读取 ListView 的顶部和末尾时,我已经实现了监听器,因此我只需要 firebase 调用。

应该怎么做?

最佳答案

我已经解决了这个问题,这是我所做的。

<强>1。首次启动该应用时,我想读取最近的 10 行。

//read the 15 latest posts from the db
postQuery.limit(15).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Read each child of the user
for(DataSnapshot child : dataSnapshot.getChildren())
{
//If this is the first row we read, then this will be the oldest post that is going to be read,
//Therefore we save the name of this post for further readings.
if(prevOldestPostId.equals(oldestPostId))
{
//Save the name of the last read post, for later readings
oldestPostId = child.getName();
}
//This if-statment is just a fail-safe, since I have an counter in the post, and that one I do not want to read.
if(child.getName() != "nrOfPosts")
{
//Gather the data from the database
UserPost readPost = new UserPost();
for(DataSnapshot childLvl2 : child.getChildren()) {
if(childLvl2.getName() == "post")
readPost.setMessage(childLvl2.getValue().toString());
else
readPost.setDate(childLvl2.getValue().toString());
}
//Add the data to a temporary List
toAdd.add(0, readPost);
}
//Keep the name of the newest post that has been read, we save this for further readings.
newestPostId = child.getName();
}
//prevOlddestPostId is helping us to keep the the currently oldest post-name.
prevOldestPostId = oldestPostId;
//Add the new posts from the database to the List that is connected to an adapter and later on a ListView.
for (UserPost aToAdd : toAdd) thePosts.add(aToAdd);

// We need notify the adapter that the data have been changed
mAdapter.notifyDataSetChanged();

// Call onLoadMoreComplete when the LoadMore task, has finished
mListView.onRefreshComplete();
}

@Override
public void onCancelled(FirebaseError firebaseError) {

}
});

<强>2。当我到达 listView 的末尾时,我想再获取 10 行,从目前已读取的最旧行开始。

postQuery.endAt(1, oldestPostId).limit(15).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Gather the data
for(DataSnapshot child : dataSnapshot.getChildren())
{
if(prevOldestPostId.equals(oldestPostId) && !child.getName().equals("nrOfPosts"))
{
//Save the name of the last read post, for later readings
oldestPostId = child.getName();
}

if(child.getName() != "nrOfPosts" && !prevOldestPostId.equals(child.getName()))
{
UserPost readPost = new UserPost();

for(DataSnapshot childLvl2 : child.getChildren()) {
if(childLvl2.getName() == "post")
readPost.setMessage(childLvl2.getValue().toString());
else
readPost.setDate(childLvl2.getValue().toString());
}
toAdd.add(0, readPost);

}
}
prevOldestPostId = oldestPostId;

//Insert it to the List for the listView
for (UserPost aToAdd : toAdd)
{
thePosts.add(aToAdd);


// We need notify the adapter that the data have been changed
mAdapter.notifyDataSetChanged();
}
}

@Override
public void onCancelled(FirebaseError firebaseError) {

}
});

<强>3。当我拉到 listView 的顶部时,我想获取在现在显示为第一行之后的所有行。 (这样可以理解吗……?)

postQuery.startAt(1, newestPostId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot child : dataSnapshot.getChildren())
{
if(child.getName() != "nrOfPosts")
{
UserPost readPost = new UserPost();

for(DataSnapshot childLvl2 : child.getChildren()) {
if(childLvl2.getName() == "post")
readPost.setMessage(childLvl2.getValue().toString());
else
readPost.setDate(childLvl2.getValue().toString());
}
//Prevent from get the currently newest post again...
if(!readPost.getMessage().equals(thePosts.get(0).getMessage()))
toAdd.add(readPost);

//Save the name of the last read post, for later readings
newestPostId = child.getName();
}
}
for (UserPost aToAdd : toAdd)
{
thePosts.add(0, aToAdd);

// Call onLoadMoreComplete when the LoadMore task, has finished
mListView.onRefreshComplete();
}
}

@Override
public void onCancelled(FirebaseError firebaseError) {

}
});

我希望我至少能对某人有所帮助。

关于android - 从 firebase 读取数据,并填充到 ListView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26386959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com