ArrayView似乎是空白的ArrayAdapter

时间:2015-10-24 10:12:49

标签: android listview

尝试使用Listview设置简单的ArrayAdapter。但是,无法在输出中看到任何列表。

以下是代码:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Parse.initialize(this, "key", "key");
    setContentView(R.layout.activity_big_board);


    countryLocal = new ArrayList<String>();


    ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Country");


    query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> CountryList, ParseException e) {
            if (e == null) {
                for(int i=0;i<CountryList.size();i++)
                {
                    temp = CountryList.get(i).getString("Name");

                    countryLocal.add(temp);
                    Log.d("OUT", "So the Val::------> " + countryLocal);
                }
            } else {
                Log.d("score", "Error: " + e.getMessage());
            }
        }
    });

    ArrayAdapter<String> namesArrayAdapter =new ArrayAdapter<String>(this,R.layout.user_list_item, countryLocal);

    ListView usersListView = (ListView)findViewById(R.id.usersListView);
    usersListView.setAdapter(namesArrayAdapter);


}

Logcat似乎没有错误,但是当我从云加载数据时,是否需要等待或从其他线程加载某些内容?或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

由于查询是异步执行的,因此在您创建并设置适配器之后,可能会填充countryLocal ArrayList。

如果在调用usersListView.setAdapter(...)时列表为空,则adapter.getItemCount()将返回0并且ListView将不显示任何内容。

您有责任让ListView知道数据集何时发生变化,以便它可以重新查询适配器。

您可以通过在适配器上使用notifyDataSetChanged来执行此操作 - 这使得在适配器上订阅的任何人都知道数据集已更改。

为了允许您这样做,您可以在开始查询之前声明并创建ArrayAdapter,这样您就可以在知道查询完成时使用引用来调用notifyDataSetChanged()

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Parse.initialize(this, "key", "key");
    setContentView(R.layout.activity_big_board);

    countryLocal = new ArrayList<String>();
    final BaseAdapter namesArrayAdapter = new ArrayAdapter<String>(this, R.layout.user_list_item, countryLocal);

    ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Country");

    query.findInBackground(new FindCallback<ParseObject>() {

        @Override
        public void done(List<ParseObject> CountryList, ParseException e) {
            if (e != null) {
                Log.d("score", "Error: " + e.getMessage());
                return;
            }
            for (int i = 0; i < CountryList.size(); i++) {
                temp = CountryList.get(i).getString("Name");
                countryLocal.add(temp);
                Log.d("OUT", "So the Val::------> " + countryLocal);
            }
            namesArrayAdapter.notifyDataSetChanged();
        }

    });

    ListView usersListView = (ListView) findViewById(R.id.usersListView);
    usersListView.setAdapter(namesArrayAdapter);
}