Java 无法在微调器中设置所选项目
我正在将数据从数据库检索到Java 无法在微调器中设置所选项目,java,android,spinner,Java,Android,Spinner,我正在将数据从数据库检索到ArrayList,然后用它填充微调器 这一切都很好,我可以看到下拉列表中的项目 但是,即使我使用了mySpinner.setSelected(INDEX) 它甚至不运行我创建的setOnItemSelectedListener中的代码 我意识到已经有很多类似的问题了,但即使在这些答案中爬行,我也无法解决这个问题 我的代码如下 public View onCreateView(LayoutInflater inflater, ViewGroup container, B
ArrayList
,然后用它填充微调器
这一切都很好,我可以看到下拉列表中的项目 但是,即使我使用了
mySpinner.setSelected(INDEX)
它甚至不运行我创建的
setOnItemSelectedListener
中的代码
我意识到已经有很多类似的问题了,但即使在这些答案中爬行,我也无法解决这个问题
我的代码如下
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_add_man_data, container, false);
// Create the variables
final FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference ref = database.getReference();
final ArrayList<String> statesForSpinner = new ArrayList<>();
final TextView txtView = v.findViewById(R.id.add_man_data_txtview_1);
// Retrieve the database data (This bit works fine)
ref.child("stateDescriptions").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int length = (int)dataSnapshot.getChildrenCount();
for(int i = 0;i<length;i++) {
statesForSpinner.add(dataSnapshot.child(Integer.toString(i)).getValue(String.class));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
// Create the spinner (This also works)
final Spinner stateSpinner = v.findViewById(R.id.state_spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_item, statesForSpinner);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
stateSpinner.setAdapter(adapter);
// But this does not work... Why?
stateSpinner.setSelection(1);
// And this never runs... Why?
stateSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> adapter, View v, int position, long id){
stateSpinner.setSelection(position);
}
@Override
public void onNothingSelected(AdapterView<?> blah){
}
});
return v;
}
创建视图时的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
//为该碎片膨胀布局
视图v=充气机。充气(R.layout.fragment\u add\u man\u data,container,false);
//创建变量
final FirebaseDatabase=FirebaseDatabase.getInstance();
final DatabaseReference=database.getReference();
final ArrayList statesForSpinner=new ArrayList();
最终文本视图txtView=v.findviewbyd(R.id.add\u man\u data\u txtView\u 1);
//检索数据库数据(此位工作正常)
ref.child(“statesdescriptions”).addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
int length=(int)dataSnapshot.getChildrenCount();
for(int i=0;i blah){
}
});
返回v;
}
在Firebase异步向您提供数据之前,您的适配器是空的 您正在向Arraylist而不是适配器添加数据,并且在新数据到达时不会通知适配器 换句话说,没有什么可以设置选择。事实上,我想你在设置选择时会得到一个越界异常,因为列表是空的 您的项目选择侦听器将触发,但您需要选择一些内容。但是,您还没有通知适配器有可用于侦听的数据
编码
final FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference ref = database.getReference();
final Spinner stateSpinner = v.findViewById(R.id.state_spinner);
final ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
stateSpinner.setAdapter(adapter);
ref.child("stateDescriptions").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int length = (int)dataSnapshot.getChildrenCount();
adapter.clear();
for(int i = 0;i<length;i++) {
adapter.add(dataSnapshot.child(Integer.toString(i)).getValue(String.class));
}
// For example, but this sets it back whenever data is added to Firebase
stateSpinner.setSelection(1);
}
@Override
public void onCancelled(DatabaseError databaseError) {
// TODO: Implement error handling
}
});
stateSpinner.setOnItemSelectedListener( ....
final FirebaseDatabase=FirebaseDatabase.getInstance();
final DatabaseReference=database.getReference();
最终微调器stateSpinner=v.findviewbyd(R.id.state\u微调器);
最终ArrayAdapter=新的ArrayAdapter(getContext(),R.layout.spinner_项);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
stateSpinner.setAdapter(适配器);
ref.child(“statesdescriptions”).addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
int length=(int)dataSnapshot.getChildrenCount();
适配器。清除();
对于(int i=0;i您为什么要使用AdapterView.OnItemSelectedListener而不仅仅是OnItemSelectedListener?@KyleHigginson因为它是一个片段,您应该为它提供视图。@Kyle这是同一件事。我错过了一个父类限定itAdd到适配器的功能!谢谢:)