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