【问题标题】:Retrieving data from firebase and displaying it in a spinner(Drop down list)从 firebase 检索数据并将其显示在微调器中(下拉列表)
【发布时间】:2018-04-18 00:47:45
【问题描述】:

我正在尝试手动将微调器数据手动添加到 Firebase,但是当我尝试在微调器下拉列表中显示它时,我收到错误:

无法将 java.lang.String 类型的对象转换为 com.appname.appname.ListItem 类型。

这是我从 firebase 检索微调器数据并将其显示在下拉微调器中的方法:

 proffRefspin.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            Log.e("Spinner Data", "Spinner data is changed!");

            Iterable<DataSnapshot> temp = dataSnapshot.getChildren();
            ArrayList<String> list = new ArrayList<>();
            for (DataSnapshot lists : temp){
                Log.d("ddd","Array List: "+lists.getValue().toString());
                list.add(lists.getValue().toString());
                textView.setText(lists.getValue().toString());
            }
            showDataInSpinner(list);

        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.e("Error", "Failed to read user", error.toException());
        }
    });

//在微调器中显示数据

 public void showDataInSpinner(ArrayList<String> data) {
    ArrayAdapter<String> adapter = new ArrayAdapter<>(
            this, android.R.layout.simple_spinner_item, data
    ); //Create the Adapter to set the data
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //Set the layout resource to create the drop down views.
    catSpinner.findViewById(R.id.defaultCats);
    catSpinner.setAdapter(adapter); //Set the data to your spinner
}

这是我的 POJO(ListItem 模型)

public class ListItem {
    private static final String TAG = "ListItem";
    @Exclude
    String userid;
    private String username,summary,status,details,profession;
    private String imageurl;

    public ListItem(){}



    public ListItem(String username, String summary, String status, String details, String profession, String imageurl) {
        this.username = username;
        this.summary = summary;
        this.status = status;
        this.details = details;
        this.profession = profession;
        this.imageurl = imageurl;
        //this.userid = userid;
    }
    public String getUserid() {
        return userid;
    }
    public void setUserid(String id) {
        this.userid = id;
    }


    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }


    public String getSummary() {
        return summary;
    }
    public void setSummary(String summary) {
        this.summary = summary;
    }

    public String getDetails() {
        return details;
    }
    public void setDetails(String details) {
        this.details = details;
    }


    public String getProfession() {
        return profession;
    }

    public void setProfession(String profession) {
        this.profession = profession;
    }




    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }

    public String getImageurl() {
        return imageurl;
    }

    public void setImageurl(String imageUrl) {
        this.imageurl = imageUrl;
    }
}

当我在我的 firebase 数据库中手动添加我的职业列表时,我收到了错误消息。但是当firebase db为空时,没有显示错误。我在这里做错了什么?我希望能够显示来自 firebase 的微调器数据。

这就是我尝试检索数据的方式

 myRef = mFirebaseDatabase.getReference("Users").child("Professions").child("profession");
    myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            ListItem data = dataSnapshot.getValue(ListItem.class);
            listItems.add(data);
            adapter.notifyDataSetChanged();

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {


        }
    });
}

这是用于显示来自 firebase 的职业的 Category Fragment 方法:

 private void getFirebaseData() {

    myRef = mFirebaseDatabase.getReference("Users").child("Professions").child("profession");
    myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            ProfessionsList data = dataSnapshot.getValue(ProfessionsList.class);
            proffItems.add(data);
            adapter.notifyDataSetChanged();

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {


        }
    });
}

但我得到了错误: Can't convert object of type java.lang.String to typecom.appname.appname.ListItem.

Firebase 数据结构的图像截图: Firebase Data screenshot

【问题讨论】:

  • 你手动添加什么?
  • 我将职业添加为根节点,职业作为子节点,然后在职业子节点中:["SoftwareEngineer","Data Scientists"]....
  • 所以我正在尝试检索此数据并将其显示在微调器中。但我的类别片段被拒绝手动添加的数据,错误无法将字符串对象转换为.......
  • 你需要单独检索每一个,所以你不会得到那个错误

标签: java android firebase firebase-realtime-database


【解决方案1】:

从firebase获取数据

ArrayList<Category> categoryList = new ArrayList<>();

databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                categoryList.add(postSnapshot.getValue(Category.class));
            }
            loadDataInSpinner();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

在微调适配器中加载数据

 private void loadDataInSpinner(){
        categoryArrayAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item, categoryList);
        spinnerPostCategory.setAdapter(categoryArrayAdapter);
        spinnerPostCategory.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                Category category = (Category) adapterView.getSelectedItem();
                spinnerSelectedId= category.getCategoryId();
                spinnerSelectedName = category.getCategoryName();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
    }

【讨论】:

  • 这里的Category是类/Activity的名称吗?
  • Category 是具有类别名称和类别 id 的模型类
  • 我想你误解了我的问题。我遇到的主要问题是,我想手动将数据添加到 firebase,然后在微调器下拉列表中显示这些数据
  • 您可以使用 firbase 语法将数据添加为 DatabaseReference databaseReference = mFirebaseDatabase.getReference().child("Category"); Map&lt;String, Category&gt; categoryMap = new HashMap&lt;&gt;(); categoryMap.put("1", new Category(1, "foo")); databaseReference.setValue(categoryMap);
  • 是的,这是添加数据的正确方法。但我想要实现的是让用户从下拉微调器中选择一个专业,然后基于此选择,保存用户详细信息在firebase中获得默认ID的专业下。
【解决方案2】:

试试这个:

ArrayList<String> list = new ArrayList<>();  
proffRefspin.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
     for(DataSnapshot datas: dataSnapshot.getChildren()){
          String profession=datas.child("profession").getValue().toString();
          list.add(profession);
     ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
      spinner.setAdapter(adapter);
        }


    }

    @Override
    public void onCancelled(DatabaseError error) {
        // Failed to read value
        Log.e("Error", "Failed to read user", error.toException());
    }
});

仅添加您在数据库中手动添加的职业,这样您将在微调器中获得一个职业列表,用户稍后可以选择该列表。您可能需要更改位置(proffRefspin),具体取决于您在何处添加 professions

将您的数据库更改为:

Users
 Professions
     randomid
         professionname: software engineer
     randomid
         professionname: data science

然后这样做:

  myRef = mFirebaseDatabase.getReference("Users").child("Professions");
myRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        String prof=dataSnapshot.child("professionname").getValue().toString();
        proffItems.add(prof);
        adapter.notifyDataSetChanged();

    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {


    }
});

【讨论】:

  • 这一行给出错误:错误是:“无法推断争论无法解析构造函数...ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item,列表);
  • 我添加了这个活动:但我仍然得到一个错误:“表达式预期”.ArrayAdapter adapter = new ArrayAdapter(UserProfileActivity,this, android.R.layout.simple_spinner_item, list );
  • @John 做:ArrayAdapter&lt;String&gt; adapter = new ArrayAdapter&lt;String&gt;(getApplicationContext(), android.R.layout.simple_spinner_item, list);
  • 谢谢彼得..这没有错误..但是现在当我尝试将来自 firebase 的数据显示为显示类别的列表时,我得到了同样的错误:“无法转换对象类型为 java.lang.String 的类型为 com.appname.appname.ListItem。"
  • 数据不是被添加到微调器中了吗?还有哪些数据是模型类或仅您在列表中添加的职业?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多