Android Asynchronous Http Client を使用して HTTP リクエストを処理し、ListView に持っている JSON フィードのコンテンツを入れようとしています。ただし、リクエストの性質により、アダプターは、null
必要なデータの配列ではなく値を受け取ると思います。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ApplicationGlobal g = (ApplicationGlobal) getApplication();
boolean userLoggedIn = g.getUserLoggedIn();
AsyncHttpClient clientSession = new AsyncHttpClient();
PersistentCookieStore cookieStore = g.getCookieStore();
clientSession.setCookieStore(cookieStore);
if (!userLoggedIn) {
login();
} else {
ArrayList<HashMap<String, String>> newsFeed = getNewsJson();
// Second to be printed:
System.out.println("LIST DATA");
System.out.println(newsFeed);
SimpleAdapter adapter = new SimpleAdapter(
this,
newsFeed,
R.layout.assignment_list_row_view,
new String[] { "photo", "dateAssigned", "dateDue",
"description" },
new int[] { R.id.text1, R.id.text2, R.id.text3, R.id.text4 });
setListAdapter(adapter);
}
}
ArrayList<HashMap<String, String>> newsFeed = new ArrayList<HashMap<String, String>>();
private ArrayList<HashMap<String, String>> getNewsJson() {
ApplicationGlobal g = (ApplicationGlobal) getApplication();
AsyncHttpClient clientSession = new AsyncHttpClient();
PersistentCookieStore cookieStore = g.getCookieStore();
clientSession.setCookieStore(cookieStore);
clientSession.get("http://192.168.1.42:5000/news/dummy/all/",
new JsonHttpResponseHandler() {
@Override
public void onSuccess(JSONObject response) {
JSONArray assignments = new JSONArray();
try {
assignments = response.getJSONArray("assignments");
JSONObject c = assignments.getJSONObject(0);
for (int i = 0; i < assignments.length() + 1; i++) {
JSONObject individualAssignment = new JSONObject(
c.getString(Integer.toString(i)));
HashMap<String, String> map = new HashMap<String, String>();
map.put("photo",
individualAssignment.getString("photo"));
map.put("dateAssigned", individualAssignment
.getString("date_assigned"));
map.put("dateDue", individualAssignment
.getString("date_due"));
map.put("description", individualAssignment
.getString("description"));
newsFeed.add(map);
// Last to be printed (and printed multiple times, as expected)
System.out.println("RAW DATA");
System.out.println(newsFeed);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
// First to be printed:
System.out.println("RETURNED DATA");
System.out.println(newsFeed);
return newsFeed;
}
上記の 3 つのコメントに示されているようにonSuccess()
、データが null 以外の値でアダプターに渡されるのに十分な時間が経過していないことが原因だと思います。
このコード スニペットが適切に機能するように再設計するには、どうすればよいでしょうか?