无法在微调器中设置所选项目

问题描述 投票:1回答:1

我正在从数据库中检索数据到ArrayList,然后用于填充Spinner。 这一切都很好,我可以看到下拉列表中的项目。

但是,它没有显示所选项目,即使我使用过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;
}
java android spinner
1个回答
1
投票

您的适配器为空,直到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( .... 

理想情况下,我认为你应该使用for (DataSnapshot child : dataSnapshot.children())而不是获得长度,然后让孩子在那个位置

© www.soinside.com 2019 - 2024. All rights reserved.