【问题标题】:Populate ListView list填充 ListView 列表
【发布时间】:2021-01-14 09:18:44
【问题描述】:

我正在尝试在 Android Studio 中创建一个 ListView 活动。 该应用程序已连接到 Cloud Firestore。我想要的是从云端获取数据,将“名称”和“分数”存储在用户的 ArrayList 中。 这很好用,添加了用户。然后我想从这个列表中获取项目并将它们添加到一个包含字符串的新 ArrayList 中,并且这个列表被传递给 ListView 以显示数据。 这样, usersStringList 将为空。如果我手动添加一些项目,它会起作用,并且 ListView 会显示元素。

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);
    }
}

我应该怎么做才能用数据填充 usersStringList?

【问题讨论】:

    标签: java android listview google-cloud-firestore


    【解决方案1】:

    您可以在数据从云端返回时实例化适配器,通常在setUpList() 中,或者您可以将适配器作为类字段,并在setUpList() 中调用arrayAdapter.notifyDataSetChanged()

    将第一个选项应用于您的代码:

    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);
    
        }
        
    }
    

    【讨论】: