在我的应用程序中,我正在尝试显示ArrayList
中的数据。用户可以转到我的ArrayList中的下一个和上一个元素,并显示该位置的数据。我的问题是,我不知道如何显示来自Parse.com的数据。例如,我在UI线程上检查什么条件来检查它是否已加载到ArrayList
中以便我可以显示它?我假设第一个元素未加载时,我只会显示一个进度条。
另外,当检索到所有行并且可以显示时,如何通知UI线程?我会设置一个全局变量吗?
可能适用于Parse.com的2个查询:
// This is used to get a list of objects from the query
ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
query.whereEqualTo("playerName", "Dan Stemkoski");
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> scoreList, ParseException e) {
if (e == null) {
Log.d("score", "Retrieved " + scoreList.size() + " scores");
} else {
Log.d("score", "Error: " + e.getMessage());
}
}
});
// This one is used to get a single object as opposed to a list of objects
ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
query.getInBackground("xWMyZ4YEGZ", new GetCallback<ParseObject>() {
public void done(ParseObject object, ParseException e) {
if (e == null) {
// Here I would add this to the list
// object will be your game score
} else {
// something went wrong
}
}
});
现在,我可能想要使用获取List<ParseObject>
的查询,因为我从整个列获取数据,而不仅仅是单个对象。但是,如果是这样的话,那么每个元素何时完成并不是不可能的?回调只会告诉您所有列表何时完成加载。我认为第二个可能是可能的,因为我知道每个人完成的时间,但我怎么知道哪一行我还没有从该列中查询。解决这个问题的一种方法是做一个选择条件,但这似乎非常强烈的计算。我做过这样的事情,但只针对ListViews
和Cursors
。
我最初的想法是只显示一个加载对话框进度条,但这与阻止UI线程没什么区别。
答案 0 :(得分:1)
实际上,使用进度对话框与阻止UI线程不同:用户可以关闭对话框(并且您必须在代码中正确处理它。)阻止UI线程意味着不处理输入任何类型(包括Android生命周期回调)和ANR的机会。
如果您将ArrayList
包裹在Adapter
中并且您的UI组件(即ListView
)是从该适配器提供的,您可以自由地(必要时保护)向您的{添加数据{1}},只需调用ArrayList
方法即可通知更改视图。这将导致UI更新其数据显示。将其与BaseAdapter.notifyDataSetChanged()
或其他机制相结合,在后台进行数据传输,它将实现您的目标。