Java 使用Firebase数据库填充的Android spinner未选择项目

Java 使用Firebase数据库填充的Android spinner未选择项目,java,android,firebase,firebase-realtime-database,android-spinner,Java,Android,Firebase,Firebase Realtime Database,Android Spinner,我通过填充final List categories=new ArrayList(),在Android spinner中动态添加了项来自Firebase数据库。 项目正在成功加载,如屏幕截图所示: 但是,微调器没有将第一项显示为提示(下面的快照),也没有选择该项 我已添加以下代码以供参考: 活动\u选择\u category.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.Cons

我通过填充
final List categories=new ArrayList(),在Android spinner中动态添加了项来自Firebase数据库。
项目正在成功加载,如屏幕截图所示:

但是,微调器没有将第一项显示为提示(下面的快照),也没有选择该项

我已添加以下代码以供参考:

活动\u选择\u category.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    tools:context=".SelectCategoryActivity">

    <Spinner
        android:id="@+id/spinner_select_category"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</android.support.constraint.ConstraintLayout>

选择CategoryActivity.java

package com.example.digicube;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.ArrayList;
import java.util.List;

public class SelectCategoryActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_category);

        Spinner selectCategorySpinner = findViewById(R.id.spinner_select_category);
        final List<String> categories = new ArrayList<>();
        DatabaseReference mCategoriesDatabaseReference = FirebaseDatabase.getInstance().getReference().child("categories");
        mCategoriesDatabaseReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                Category category = dataSnapshot.getValue(Category.class);
                category.setKey(dataSnapshot.getKey());
                categories.add(0, category.getCategoryName());
            }
            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
            }

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

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
        ArrayAdapter<String> categoryAdapter = new ArrayAdapter<String>(SelectCategoryActivity.this, android.R.layout.simple_spinner_item, categories){
            @Override
            public boolean isEnabled(int position) {
                return position != 0;
            }

            @Override
            public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                View view =  super.getDropDownView(position, convertView, parent);
                TextView hintView = (TextView) view;
                if (position == 0) {
                    hintView.setText(R.string.select_category_spinner);
                }
                return view;
            }
        };
        categoryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        selectCategorySpinner.setAdapter(categoryAdapter);
        selectCategorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long l) {
                if (position > 0) {
                    String item = parent.getItemAtPosition(position).toString();
                    Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show();
                }
            }

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

            }
        });
    }
}
package com.example.digicube;
导入android.os.Bundle;
导入android.support.annotation.NonNull;
导入android.support.annotation.Nullable;
导入android.support.v7.app.AppActivity;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.Spinner;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.google.firebase.database.ChildEventListener;
导入com.google.firebase.database.DataSnapshot;
导入com.google.firebase.database.DatabaseError;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入java.util.ArrayList;
导入java.util.List;
公共类SelectCategoryActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u select\u category);
微调器selectCategorySpinner=findViewById(R.id.Spinner\u select\u category);
最终列表类别=新的ArrayList();
DatabaseReference mCategoriesDatabaseReference=FirebaseDatabase.getInstance().getReference().child(“类别”);
McCategoriesDatabaseReference.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildaded(@NonNull DataSnapshot DataSnapshot,@null字符串s){
Category Category=dataSnapshot.getValue(Category.class);
category.setKey(dataSnapshot.getKey());
添加(0,category.getCategoryName());
}
@凌驾
public void onChildChanged(@NonNull DataSnapshot DataSnapshot,@null字符串s){
}
@凌驾
公共void onChildRemoved(@NonNull DataSnapshot DataSnapshot){
}
@凌驾
public void onChildMoved(@NonNull DataSnapshot DataSnapshot,@null字符串s){
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
ArrayAdapter categoryAdapter=新的ArrayAdapter(选择CategoryActivity.this,android.R.layout.simple\u微调器\u项目,类别){
@凌驾
公共布尔值isEnabled(整型位置){
返回位置!=0;
}
@凌驾
公共视图getDropDownView(int位置,@Nullable视图convertView,@NonNull视图组父级){
视图=super.getDropDownView(位置、转换视图、父级);
TextView hintView=(TextView)视图;
如果(位置==0){
hintView.setText(R.string.select\u category\u微调器);
}
返回视图;
}
};
categoryAdapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
选择CategorySpinner.setAdapter(categoryAdapter);
selectCategorySpinner.setOnItemSelectedListener(新建AdapterView.OnItemSelectedListener()){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长l){
如果(位置>0){
String item=parent.getItemAtPosition(position.toString();
Toast.makeText(parent.getContext(),“Selected:”+项,Toast.LENGTH_LONG.show();
}
}
@凌驾
未选择公共无效(AdapterView AdapterView){
}
});
}
}

您无法将从数据库获得的
类别
列表传递到回调外部的适配器,因为它始终为空。这就是为什么你有空屏幕。请注意,
onchildaded()
方法具有异步行为


这个问题的一个快速解决方法是将适配器的声明移动到
onDataChange()
方法中,然后通知适配器。有关更多详细信息,我建议您查看我的anwser,我在其中解释了如何在回调之外获取对象。您还可以查看此以便更好地理解。

您可以使用spinner.setSelection(index)方法以编程方式选择项