我正在从数据库中检索数据到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;
}
答案 0 :(得分: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())
而不是获得长度,然后让孩子到达那个位置