If a user picked the book "Hamlet" previously, in the new edit activity I want the spinner to be already selected at "Hamlet" and then they can change this if they want to but i'm getting this error message:
NullPointerException Attempt to invoke ArrayAdapter.getPosition on a null object reference
In the code bellow, retrieveAndSetData() should get the selected book on database to show on spinner and prepareListOfBooks() should populate the same spinner with all books of current user for update action
step 1
private void retrieveAndSetData(Library l){
library = l;
prepareListOfBooks();
String bookValue = library.getBookId();
ArrayAdapter bookAdapt;
int bookSpinnerPosition;
bookAdapt = (ArrayAdapter) bookListSpinner.getAdapter();
bookSpinnerPosition = bookAdapt.getPosition(bookValue);
bookListSpinner.setSelection(bookSpinnerPosition);
}
step 2
private void prepareListOfBooks(){
database = FirebaseDatabase.getInstance().getReference("books");
account = GoogleSignIn.getLastSignedInAccount(this);
firebaseUser = account.getId();
query = database.orderByChild("ownerId").equalTo(firebaseUser);
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final List<String> books = new ArrayList<String>();
for (DataSnapshot bookSnapshot: dataSnapshot.getChildren()) {
String bookName = bookSnapshot.child("name").getValue(String.class);
books.add(bookName);
}
Spinner bookSpinner = (Spinner) findViewById(R.id.bookListSpinner);
ArrayAdapter<String> booksAdapter = new ArrayAdapter<String>(EditBookActivity.this, android.R.layout.simple_spinner_item, books);
booksAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bookSpinner.setAdapter(booksAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
Please, what is wrong with my code?
EDIT 1
I changed my code but still get the same error. Here what i changed and some more details that i didn't show before:
public class EditBookActivity extends AppCompatActivity {
Spinner bookListSpinner;
}
protected void onCreate(Bundle savedInstanceState) {
....
prepareListOfBooks();
...
bookListSpinner = (Spinner) findViewById(R.id.bookListSpinner);
}
private void prepareListOfBooks(){
database = FirebaseDatabase.getInstance().getReference("books");
account = GoogleSignIn.getLastSignedInAccount(this);
firebaseUser = account.getId();
query = database.orderByChild("ownerId").equalTo(firebaseUser);
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final List<String> books = new ArrayList<String>();
for (DataSnapshot bookSnapshot: dataSnapshot.getChildren()) {
String bookName = bookSnapshot.child("name").getValue(String.class);
books.add(bookName);
}
ArrayAdapter<String> booksAdapter = new ArrayAdapter<String>(EditBookActivity.this, android.R.layout.simple_spinner_item, books);
booksAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//changed the line bellow, i dont create a new spinner variable, i use the same variable that is declared in the begining of this class
bookListSpinner.setAdapter(booksAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void retrieveAndSetData(Library l){
library = l;
String bookValue = library.getBookName();
ArrayAdapter bookAdapt;
int bookSpinnerPosition;
bookAdapt = (ArrayAdapter) bookListSpinner.getAdapter(); //null pointer is here
bookSpinnerPosition = bookAdapt.getPosition(bookValue);
bookListSpinner.setSelection(bookSpinnerPosition);
}