使用多个异步http请求填充Listview - loopj?

时间:2014-05-02 06:01:25

标签: android asynchronous android-listview loopj listview-adapter

TLDR: 我需要做的是发出多个异步HTTP请求并使用数据来填充列表视图 - 如果有必要,我会采用全新的方法。

嗨,我是Android的新手,我正在尝试使用Loopj的异步http客户端库。我以他的建议方式实现了客户端,我正在检索数据没问题。我的问题是从我的处理程序的onSuccess中获取数据回到我想用于listview的适配器的数据集。

我做了很多阅读;在stackoverflow和其他来源。是什么让我的情况与我发现的大多数解决方案不同,我必须在设置我的适配器之前发出多个http请求。

我的适配器的数据源是我实现的自定义类型ScoutProfile的数组。 旁注:如果我对数据集的值进行硬编码,一切正常。

我在尝试使用虚拟数据执行请求之前尝试过设置适配器。将适配器数据集交换出更新的阵列。调用notifyDataSetChanged和invalidateViews。

如果我没有初始化数组,我会得到一个null异常(onSuccess中的更改没有生效?)。如果我实例化它 - 这意味着我使用notifyDataSetChanged - UI永远不会更新。

我也试过了runOnUIThread方法。

这是我片段中的代码:

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_scoutprofile, container, 
                                                                               false);
    RiotApiClient client = new RiotApiClient();
    profiles = new ScoutProfile[ids.length];

    mListView = (AbsListView) view.findViewById(android.R.id.list);

            final IntWrapper count = new IntWrapper(0);
    for(int j = 0; j < ids.length; j++) {
        final int index = j;
        String url = String.format("/api/lol/na/v2.3/league/by-summoner/%d/entry?", 
                                                                               ids[j]);
        client.get(url, null, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(String r) {
                try {
                    JSONArray response = new JSONArray(r);
                    for (int i = 0; i < response.length(); i++) {
                        JSONObject profile = response.getJSONObject(i);
                        if (profile.get("queueType") == "RANKED_SOLO_5x5") {
                            profiles[index] = new 
    ScoutProfile(profile.getString("playerOrTeamName"), "Silver", "Silver", "n/a", 40);
                            Log.e("ScoutProfileFragment", profiles[index].getName());
                            i = response.length();
                        }
                    }
                    count.integer += 1;
                    Log.e("ScoutProfileFragment", Integer.toString(count.integer));
                    if(count.integer == ids.length)
                    {
                        setUpAdapter(view);
                    }

                } catch (Exception ex) {

                }

            }
        });
    }
    return view;
}

我确信我没有包含的代码:ScoutProfile.java,ScoutProfileAdapter.java,RiotApiClient等不是问题 - 但是如果有人要求我,我会将它添加到我的问题中。

编辑: 我打算包括这个(也在片段代码中):

public void setUpAdapter(View view)
{
    Log.e("ScoutProfileFragment", "setUpAdapter");
    mAdapter = new ScoutProfileAdapter(view.getContext(), profiles);
    ((AdapterView<ListAdapter>) mListView).setAdapter(mAdapter);
}

0 个答案:

没有答案