Ballazx
Ballazx

Reputation: 579

Populate ListView list

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

Answers (1)

Zain
Zain

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

Related Questions