从 Firebase 检索第二个项目时出错

Posted

技术标签:

【中文标题】从 Firebase 检索第二个项目时出错【英文标题】:Got an error when I retrieve second item from Firebaase 【发布时间】:2021-05-05 19:08:02 【问题描述】:

这是我的第一个 android 应用程序,我很兴奋,但我在最后一个函数中遇到了错误。可以检索第一个数据,但是当我从 firebase 数据库检索第二个数据时出现错误 "java.lang.IndexOutOfBoundsException: Index: 1, Size 1 at java.util.ArrrayList.get()"

这是我的程序

//start here
DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("Users")
        .child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Wishlist");

myRef.addListenerForSingleValueEvent(new ValueEventListener() 
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) 
        List<String> wishlist_item = new ArrayList<String>();
        for (DataSnapshot postSnapshot: snapshot.getChildren()) 
            String data = postSnapshot.getValue(String.class);
            wishlist_item.add(data);
        


        //list 1
        L1.setOnClickListener(new View.OnClickListener() 
            String a = wishlist_item.get(0);
            @Override
            public void onClick(View view) 
                if(a.isEmpty())
                    Toast.makeText(wish_list.this, "Empty Field", Toast.LENGTH_SHORT).show();
                else
                    Intent launchWish = new Intent(wish_list.this,web_view2.class);
                    launchWish.putExtra("k",a);
                    startActivity(launchWish);
                
            
        );
        //list 2
        L2.setOnClickListener(new View.OnClickListener() 
            String b = wishlist_item.get(1);
            @Override
            public void onClick(View view) 
                if(b.isEmpty())
                    Toast.makeText(wish_list.this, "Empty Field", Toast.LENGTH_SHORT).show();
                else
                    Intent launchWish = new Intent(wish_list.this,web_view2.class);
                    launchWish.putExtra("k",b);
                    startActivity(launchWish);
                
            
        );
        //the end for 5 lists

    
    @Override
    public void onCancelled(@NonNull DatabaseError error) 
    
);

我只想从我的 Firebase 中检索 5 个数据。你可以在这里查看我的 firebase 表

You can see my firebase table here

我从昨天开始一直在解决这个问题,但没有得到任何答案。非常感谢您的帮助。

【问题讨论】:

如果您尝试在“onDataChange()”方法中记录data 对象,是否会在 logcat 中打印出一些内容? 不,先生@AlexMamo 那么你的 onDataChange 是否被触发了?除此之外,停止忽略错误。使用Log.d(TAG, databaseError.getMessage());。您是否在 logcat 中打印了一些内容? 我用 textview 打印出 wishlist_item,它给了我来自 firebase 数据库的所有数据,但是当我尝试像这样 .get(1) 得到错误时,@AlexMamo 点击L1或L2时会出现这种情况吗? 【参考方案1】:

正如您在问题中提到的,您收到以下错误:

“java.lang.IndexOutOfBoundsException:索引:1,java.util.ArrayList.get() 的大小为 1”

因为您试图从“ArrayList”中不存在的位置获取元素。正如我在以下参考资料中看到的:

Firebase-root -> Users -> "GRUK ... cL03" -> Wishlist

那里有两个项目,但是,错误消息非常明确地说只有一个。最有可能的是,第二个用户“T9az ... I4v2”的愿望清单,我认为它是真正的登录用户,在愿望清单中包含一个项目,因此出现了错误。所以为了解决这个问题,在使用它们之前,一定要确保你可以在相应的索引处找到元素,而不是盲目地假设一个元素总是存在的。

【讨论】:

啊,是的,你是对的,但是当我添加更多按钮然后数据库中的数据量时,应用程序出错了。我该如何处理?总是会有 5 个按钮,但数据库中不会有 5 个项目,它会是空的或 1 或 2 或 3。那么我该如何处理呢? @Alex Mamo 很简单,在访问其中一个元素之前检查数组的大小。比如你想从第二个位置(索引1)获取一个元素,确保数组的大小是wishlist_item.size() &gt;= 2,对吧? 我可以把先生放在哪里我不能把它放在 L1 onClick @Alex Mamo 每次尝试访问数组中的元素时都需要设置该条件。您始终需要确保特定索引存在。 知道了,先生,非常感谢您的帮助。你介意告诉我我怎样才能只接受 5 个项目到 firebase DatabaseReference myRef = FirebaseDatabase.getInstance() .getReference().child("Users") .child(FirebaseAuth.getInstance().getCurrentUser().getUid()) .child("愿望清单"); myRef.push().setValue("librarything.com/isbn" + passURL).addOnCompleteListener(new OnCompleteListener()

以上是关于从 Firebase 检索第二个项目时出错的主要内容,如果未能解决你的问题,请参考以下文章

从 firebase 检索图像时出错

使用 KOTLIN 从 firebase 检索数据时出错

如何从 fire-base 检索数据到新活动中单击 RecyclerView

从firebase检索图像以在片段中的回收器视图时出错

如何从firebase数据中检索数据短片

Firebase SignUp始终出错