在arraylist中动态显示数据

时间:2014-02-24 03:01:41

标签: android multithreading parse-platform

在我的应用程序中,我正在尝试显示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>的查询,因为我从整个列获取数据,而不仅仅是单个对象。但是,如果是这样的话,那么每个元素何时完成并不是不可能的?回调只会告诉您所有列表何时完成加载。我认为第二个可能是可能的,因为我知道每个人完成的时间,但我怎么知道哪一行我还没有从该列中查询。解决这个问题的一种方法是做一个选择条件,但这似乎非常强烈的计算。我做过这样的事情,但只针对ListViewsCursors

我最初的想法是只显示一个加载对话框进度条,但这与阻止UI线程没什么区别。

https://parse.com/docs/android_guide#queries

1 个答案:

答案 0 :(得分:1)

实际上,使用进度对话框与阻止UI线程不同:用户可以关闭对话框(并且您必须在代码中正确处理它。)阻止UI线程意味着不处理输入任何类型(包括Android生命周期回调)和ANR的机会。

如果您将ArrayList包裹在Adapter中并且您的UI组件(即ListView)是从该适配器提供的,您可以自由地(必要时保护)向您的{添加数据{1}},只需调用ArrayList方法即可通知更改视图。这将导致UI更新其数据显示。将其与BaseAdapter.notifyDataSetChanged()或其他机制相结合,在后台进行数据传输,它将实现您的目标。