1

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

嗨,我是 android 新手,我正在尝试使用 Loopj 的异步 http 客户端库。我已经按照他建议的方式实现了客户端,并且我正在检索数据没有问题。我的问题是将处理程序的 onSuccess 中的数据返回到我想用于列表视图适配器的数据集。

我读了很多书;关于stackoverflow和其他来源。使我的情况与我发现的大多数解决方案不同的是,我必须先发出多个 http 请求,然后才能设置我的适配器。

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

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

如果我不初始化数组,我会得到一个空异常(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);
}
4

0 回答 0