Reputation: 425
I'm creating an android app which is used for hotel management.
I want to show the user, the number of rooms available in the form of spinner.
I'm storing the details(roomNumber, name address etc..) in google firebase.
If the user is logging in the app for first time then all the room numbers in spinner should be visible. But if the user has already booked a room then that room number should not be visible in spinner.
Here is the java code:
documentReference.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if(documentSnapshot.exists()){
roomNumberDocument=documentSnapshot.getString("RoomNumber");
if(roomNumberDocument!=null){
for (int i = 100; i < 111; i++) {
if(Integer.parseInt(roomNumberDocument)==i){
continue;
}
roomNumbersList.add(Integer.toString(i));
}
}else{
//room numbers
roomNumbersList.add("100");
roomNumbersList.add("101");
roomNumbersList.add("102");
roomNumbersList.add("103");
roomNumbersList.add("104");
roomNumbersList.add("105");
roomNumbersList.add("106");
roomNumbersList.add("107");
roomNumbersList.add("108");
roomNumbersList.add("109");
roomNumbersList.add("110");
}
}
}
});
If the room is already booked then roomNumberDocument
will not be null else it will be null.
If the room is already booked then I will not add it into the ArrayList roomNumbersList
.
Here I'm setting up the adapter:
adapterRoomNumbers= new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, roomNumbersList);
adapterRoomNumbers.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerRoomNumber.setAdapter(adapterRoomNumbers);
Here is the click listener for the spinner:
spinnerRoomNumber.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
strRoomNumber= adapterView.getItemAtPosition(i).toString();
Toast.makeText(context, ""+strRoomNumber, Toast.LENGTH_LONG).show();
Log.i(TAG, strRoomNumber);
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
The problem is that setOnItemSelectedListener()
is not called if I select any item in the spinner.
Because of that strRoomNumber
is getting null. I will use strRoomNumber
for storing it in the firebase database.
Here is my full code
What might be the problem?
Upvotes: 1
Views: 516
Reputation: 2904
Try move the codes for setting up the adapter to just before documentReference.get().addOnSuccessListener .......
and inside onSuccess method, add this as the last line: adapterRoomNumbers.notifyDataSetChanged();
Explanation: Adapter is not updated correctly as calls to firebase is an async process.
Upvotes: 1
Reputation: 1135
your setOnItemSelectedListner
must look like this:
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
int i, long id) {
strRoomNumber = adapterView.getItemAtPosition(i).toString;
if (item != null) {
Toast.makeText(MainActivity.this, item.toString(),
Toast.LENGTH_SHORT).show();
}
Toast.makeText(MainActivity.this, ""+strRoomNumber, Toast.LENGTH_LONG).show();
Log.i(TAG, strRoomNumber);
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
also check this out for more info setOnItemSelectedListener of Spinner does not call
Upvotes: 0