Reputation: 1
I'm making an attendance application that would use Firebase as a backend. I have a spinner Semester
, based on which another spinner Class should be populated.
I'm able to fetch data from Firebase and populate the Semester spinner but based on it's choice, the Class spinner isnt working.
Here's my attempt:
package info.androidhive.firebase;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.ViewParent;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;
import java.util.ArrayList;
import java.util.List;
/*
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
*/
public class TakeAttendanceMenu extends AppCompatActivity implements OnItemSelectedListener{
String baseDb = "Courses";
String selectedSem;
String semClassDb;
Spinner semSpinner,classSpinner,subjectSpinner;
private static final String TAG = "TakeAttendanceMenu";
FirebaseFirestore db = FirebaseFirestore.getInstance();
List<String> semSpinnerList = new ArrayList<String>();
List<String> ClassSpinnerList = new ArrayList<String>();
public void getAllSemesters()
{
db.collection(baseDb)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful()){
for(DocumentSnapshot document: task.getResult()){
Log.d(TAG,document.getId() + "=>" + document.getData());
semSpinnerList.add(document.getId());
}
}
Toast.makeText(getApplicationContext(), "Please chal ja bc", Toast.LENGTH_SHORT).show();
}
});
}
public void getSemesterClasses()
{
semClassDb = baseDb + "/" + selectedSem;
db.collection(semClassDb).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful()){
for(DocumentSnapshot documentSnapshot: task.getResult()){
ClassSpinnerList.add(documentSnapshot.getId());
}
}
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_take_attendance_menu);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
semSpinner = (Spinner)findViewById(R.id.semester_spinner);
classSpinner = (Spinner)findViewById(R.id.class_spinner);
subjectSpinner = (Spinner)findViewById(R.id.subject_spinner);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
);
getAllSemesters(); // calling this method to instantiate the first spinner(semester spinner) with the values of firestore
ArrayAdapter<String> semAdapter= new ArrayAdapter<String>(
this, android.R.layout.simple_spinner_item, semSpinnerList);
semAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
semSpinner.setAdapter(semAdapter);
/*Adapter for the Semester -> Class*/
ArrayAdapter<String> classAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,ClassSpinnerList);
classAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
classSpinner.setAdapter(classAdapter);
semSpinner.setOnItemSelectedListener(this);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(), "Item Selected "+position, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
Toast.makeText(getApplicationContext(), "Please chal ja bc", Toast.LENGTH_SHORT).show();
}
}
Upvotes: 0
Views: 647
Reputation: 10115
Looks like you missed this line:
classspinner.setOnItemSelectedListener(this);
Write it after:
/*Adapter for the Semester -> Class*/
ArrayAdapter<String> classAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,ClassSpinnerList);
classAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
classSpinner.setAdapter(classAdapter);
semSpinner.setOnItemSelectedListener(this);
..... (Write Here)
Next:
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
switch (view.getId()) {
case R.id.first_spinner:
Toast.makeText(getApplicationContext(), "Item Selected "+position, Toast.LENGTH_SHORT).show();
break;
case R.id.second_spinner:
Toast.makeText(getApplicationContext(), "Item Selected "+position, Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
Hopefully it should work.
Upvotes: 1
Reputation: 138969
The problem in your code is that you're creating and setting the adapter using a result that in not available yet. With other words, by the time you are setting the adapter the list that you are getting from the database is not available yet. To solve this, I recommend you in both cases, to create and set the adapter inside the callback. To please move each of those lines of code in the corresponding methods right after the for loop.
Upvotes: 0