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);
}