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到适配器的功能!谢谢:)