如何通过简单的for循环从Firebase Android获取所有子列表

时间:2018-08-02 06:57:44

标签: java android firebase firebase-realtime-database

下面的代码通过forEach循环使我在Firebase中的所有孩子都变得如此

final Query query = mDataBaseReference_info_channels.child(getUserDetails().getUserId()).child("channels");

query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dsp : dataSnapshot.getChildren()) {
DebugLog.d("\n test: " + dsp.toString());
}
}

但是我想使用for循环并获取最后一个位置并再次触发查询。我不想这样使用下面的代码:

i=0;
for (DataSnapshot dsp : dataSnapshot.getChildren()) {
                        i++;
if(i==datasnapt.getchildren)
{
   //fire a api 
}
}

任何人都有解决方案,然后请给我答案。

3 个答案:

答案 0 :(得分:1)

因为dataSnapshot.getChildren()返回Iterable<DataSnapshot>。使用Iterator从集合中获取最后一个项目:

DataSnapshot lastDataSnapshot = null;
Iterable<DataSnapshot>  iterable= dataSnapshot.getChildren();
for (Iterator iterator = iterable.iterator(); iterator.hasNext(); ) {
  lastDataSnapshot = iterator.next();
}

lastDataSnapshot是DataSnapshot的最后一项。用它来触发下一个api。

答案 1 :(得分:1)

如果只想从数据库中获取 Channel 节点的最后一行,请尝试以下代码。

DatabaseReference databaseReference = Firebase.getInstance().getReference();


databaseReference.child(getUserDetails().getUserId()).child("channels").orderByKey().limitToLast(1).addListenerForSingleValueEvent(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // here dataSnapshot is the value of last position.

    @Override
    public void onCancelled(DatabaseError databaseError) {
        //Handle possible errors.
    }
});

答案 2 :(得分:0)

要从DataSnapshot对象获得最后一个位置,您可以使用以下代码行计算子代数:

long count = dataSnapshot.getChildrenCount();

您的最后一个项目将在以下位置:

int lastPosition = (int) count - 1;

如果要使用for循环,请使用以下代码:

ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<YourClass> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            YourClass yourClass = ds.getValue(YourClass.class);
            list.add(yourClass);
        }

        YourClass lastItem = list.get(list.size() - 1);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
query.addListenerForSingleValueEvent(valueEventListener);

通过这种方式,您可以从上一个位置或任何其他位置获得该物品。我以YourClass为例。您的YourClass可以是String类或任何其他模型类。