Reputation: 579
I`m trying to create a ListView activity in Android Studio. The app is connected to the Cloud Firestore.What I want is get the data from the cloud, store the "name" and "score" in an ArrayList of Users. This works fine, the users are added. Then I want to get the items from this list and add them into a new ArrayList which contains Strings and this list is passed to the ListView to show the data. In this way the usersStringList will be empty. If I add some items manually it works and the ListView shows the elements.
public class ListActivity extends AppCompatActivity {
Button restartButton;
public ListView list;
public List<Users> usersList = new ArrayList<Users>();
public List<String> usersStringList = new ArrayList<String>();
FirebaseFirestore db=FirebaseFirestore.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
getUsersList();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
restartButton = findViewById(R.id.restart_button);
list = findViewById(R.id.list);
/*usersStringList.add("some text added manually");
usersStringList.add("other text added manually");*/
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, usersStringList);
list.setAdapter(arrayAdapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String clickedItem = (String) list.getItemAtPosition(position);
Toast.makeText(ListActivity.this, clickedItem, Toast.LENGTH_LONG).show();
}
});
restartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ListActivity.this, CategoryActivity.class);
ListActivity.this.startActivity(intent);
ListActivity.this.finish();
}
});
}
private void getUsersList() {
db.collection("USERS")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d("TAG", document.getId() + " => " + document.getData());
Users user=new Users(document.getString("NAME"),Integer.valueOf(document.getString("SCORE")));
usersList.add(user);
}
setUpList();
} else {
Log.w("TAG", "Error getting documents.", task.getException());
}
}
});
}
private void setUpList() {
for (int i = 0; i < usersList.size(); i++) {
usersStringList.add(i + 1 + ". place: " + usersList.get(i).username + ". Score: " + usersList.get(i).score);
}
}
What should I do to fill the usersStringList with data?
Upvotes: 2
Views: 329
Reputation: 40878
You can either instantiate the adapter when the data is returned back from the cloud, typically in setUpList()
, or you can make the adapter as a class field, and call arrayAdapter.notifyDataSetChanged()
in setUpList()
Applying the first option to your code:
public class ListActivity extends AppCompatActivity {
Button restartButton;
public ListView list;
public List<Users> usersList = new ArrayList<Users>();
public List<String> usersStringList = new ArrayList<String>();
FirebaseFirestore db=FirebaseFirestore.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
getUsersList();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
restartButton = findViewById(R.id.restart_button);
list = findViewById(R.id.list);
/*usersStringList.add("some text added manually");
// usersStringList.add("other text added manually");*/
// ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, usersStringList);
// list.setAdapter(arrayAdapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String clickedItem = (String) list.getItemAtPosition(position);
Toast.makeText(ListActivity.this, clickedItem, Toast.LENGTH_LONG).show();
}
});
restartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ListActivity.this, CategoryActivity.class);
ListActivity.this.startActivity(intent);
ListActivity.this.finish();
}
});
}
private void getUsersList() {
db.collection("USERS")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d("TAG", document.getId() + " => " + document.getData());
Users user=new Users(document.getString("NAME"),Integer.valueOf(document.getString("SCORE")));
usersList.add(user);
}
setUpList();
} else {
Log.w("TAG", "Error getting documents.", task.getException());
}
}
});
}
private void setUpList() {
for (int i = 0; i < usersList.size(); i++) {
usersStringList.add(i + 1 + ". place: " + usersList.get(i).username + ". Score: " + usersList.get(i).score);
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, usersStringList);
list.setAdapter(arrayAdapter);
}
}
Upvotes: 1