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)方法以编程方式选择项