1

TLDR: 私がしなければならないことは、複数の非同期 HTTP 要求を作成し、データを使用してリスト ビューにデータを入力することです。必要に応じて、まったく新しいアプローチを受け入れます。

こんにちは、私はアンドロイドが初めてで、Loopj の非同期 http クライアント ライブラリを使用しようとしています。彼が提案する方法でクライアントを実装しましたが、問題なくデータを取得しています。私の問題は、ハンドラーの onSuccess からリストビューのアダプターに使用したいデータセットにデータを戻すことです。

私はかなりの量の読書をしました。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);
}
4

0 に答える 0