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