【问题标题】:Why data from firebase database did not show in Spinner?为什么来自 firebase 数据库的数据没有显示在 Spinner 中?
【发布时间】:2018-10-01 08:25:01
【问题描述】:

link 中所述。我想在我的编码应用程序中尝试。但它没有从我的 firebase 数据库中检索到任何数据。我只是不知道如何解决它。有人可以帮帮我吗。有什么想法,我错过了哪里?

我的 firebase 数据库如下图所示:-

微调器编码:-

mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.keepSynced(true);

mDatabase.child("Advertisement").child(mAuth.getUid()).addValueEventListener(new ValueEventListener()
        {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot)
            {
                //final List<String> name = new ArrayList<String>();
                ArrayList<String> identity = new ArrayList<>();
                identity.add(0, "Choose Tuition Centre");

                for (DataSnapshot nameSnapshot: dataSnapshot.getChildren())
                {
                    String tuitionName = nameSnapshot.child("adstuitioname").getValue(String.class);
                    identity.add(tuitionName);
                }

                ArrayAdapter<String> nameAdapter = new ArrayAdapter<String>(RatingActivity.this, android.R.layout.simple_spinner_item, identity);
                nameAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                mName.setAdapter(nameAdapter);
            }


            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        mName.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
            {
                if(position==0)
                {
                    //Toast.makeText(getApplicationContext(),"No Item Selected",Toast.LENGTH_LONG).show();
                }

                else
                {
                    Toast.makeText(getApplicationContext(),parent.getItemAtPosition(position) +" Selected",Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent)
            {
                // TODO Auto-generated method stub
            }
        });

【问题讨论】:

  • 如果应用程序关闭,那么有一个你没有上传到这个帖子的 logcat。您也忽略了onCancelled 中的所有错误,所以请在那里放一些东西
  • 似乎有什么问题?
  • @UmangBurman 我的应用程序崩溃了,所以无法确定微调器是否显示数据
  • 你能在问题中以某种方式显示logcat以便我们理解
  • @UmangBurman Sir.. 我已经通过其他方式修复了它,但我无法从 firebase 数据库中检索数据。我已经编辑了我的问题。

标签: android firebase firebase-realtime-database


【解决方案1】:

如下添加监听器:

DatabaseReference mDatabaseRef =  
                            FirebaseDatabase.getInstance().getReference();
ArrayList<String> list=new ArrayList<>();
mDatabaseRef.child("Advertisement")
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                   for (DataSnapshot snapshot :dataSnapshot.getChildren()) 
                     {
                        Advertisementject advertisement= 
                                snapshot.getValue(Advertisement.class);
                        //replace Object.class with your class name
                        //get your key value here from your "Custom class" 
                        // which contains "adstutioname" 
                        // add in list
                        list.add(advertisement.getAdstutuioname());
                    }

                    //set adapter
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

像这样生成类

public class Advertisement{

@SerializedName("adstutuioname")
@Expose
private String adstutuioname;

public String getAdstutuioname() {
  return adstutuioname;
}

public void setAdstutuioname(String adstutuioname) {
  this.adstutuioname = adstutuioname;
}

}
  • 您的类包含所有参数和 .
  • 用这个类替换 Object

【讨论】:

  • 你能举个例子吗? 1)从包含“adstutioname”的“自定义类”中获取您的键值。 2) 加入列表
  • 我已经创建了我的广告 java 类,它由构造函数和 getter 组成。
  • 但是这个 --- >//从包含“adstutioname”和这个的“自定义类”中获取您的键值 ---> // 添加到列表中。如何 ? :D
  • 所以现在您将获得广告广告实例。然后访问 Advertisement.getAdstuuiname() 并将其添加到您的列表中
  • String tutorialName = dataSnapshot.child("adstuitioname").getValue().toString();
【解决方案2】:

我希望问题出在您的 getValue() 方法上。 Firebase getValue 方法返回一个对象,而您期望的是一个字符串。请修改此行以将您的对象转换为字符串 -

String tuitionName = nameSnapshot.child("adstuitioname").getValue(String.class).toString();

【讨论】:

  • 为什么是 areaName?我正在使用这个,先生,String tutorialName = nameSnapshot.child("adstuitioname").getValue(String.class);
  • 先生……还是一样。但我以其他方式修复它,我无法从 firebase 数据库中检索数据。我已经编辑了我的问题。
【解决方案3】:

不清楚你是想读一次,还是看变化Difference between addValueEventListener() and addListenerForSingleValueEvent() of firebase

首先,看看你是否遇到了数据库错误

@Override
public void onCancelled(DatabaseError databaseError) {
    // Toast or print the databaseError, don't ignore it
}

然后看看你在哪里添加了一个监听器 - mDatabase.child("Advertisement").child(mAuth.getUid()).,从你的图片来看,它是-LNZ6...级别的每个元素。

对于该级别,您有一个对象列表,因此您可能需要使用循环,如 Firebase 网站上的一些示例所示,建议您制作一个对象,但您仍然可以使用 child 方法对于您正在尝试做的某个领域

但是如果一个字段不存在,你会得到空值,并且适配器不能保存空值,所以你必须忽略或设置一些默认值。

ArrayList<String> identity = new ArrayList<>();
identity.add(0, "Choose Tuition Centre");

for (DataSnapshot nameSnapshot: dataSnapshot.getChildren())  {
    String tuitionName = nameSnapshot.child("adstuitioname").getValue(String.class);
    Log.d("DEBUG TUITION", String.valueOf(tuitionName);  // look for this in your logs 
    identity.add(tuitionName == null ? "none" : tuitionName);
}
ArrayAdapter<String> nameAdapter =... 

【讨论】:

  • 先生,我已经尝试过了,还是一样,this = {RatingActivity$2@6534} dataSnapshot = {DataSnapshot@6536} "DataSnapshot { key = 52ictJZU8TWWqOsGbpnQ6GDCYUv1, value = null }" identity = {ArrayList@ 6537} 大小 = 1
  • 我想用 Firebase 数据库中的数据填充微调器。如果补习中心改名了,那么 Spinner 中的列表数据也会改变。
  • 那么看来dataSnapshot.getChildren() 是空的,并且您没有将侦听器添加到正确的对象。例如,你怎么知道需要添加mAuth.getUid()?那是正确的 ID 吗?
  • 另外,你的评论是52ictJZU8TWWqOsGbpnQ6GDCYUv1,但图片中没有
猜你喜欢
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2014-02-02
  • 1970-01-01
相关资源
最近更新 更多