私は Web サービスから JSON 応答を取得し、すべての要素を listview に書き込む必要があるアプリに取り組んでいます。AsyncTaskを使用して HTTP 応答を取得する必要があることを読みました。それを実行したところ、 Web サービスからデータを取得できました。それらをTextViewsに表示します。しかし、リストビューに要素を表示しようとすると、何も表示されず、logcat に次のメッセージが表示されます。06-05 19:44:27.418: I/Choreographer(20731): Skipped 60 frames! The application may be doing too much work on its main thread.
ここに私のメインコードがあります:
public class MainActivity extends Activity {
private static JsonObject response = new JsonObject();
private ArrayList<SearchResults> results = new ArrayList<SearchResults>();
private SearchResults sr1 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new LoginAction().execute("");
ArrayList<SearchResults> searchResults = results;
final ListView lv1 = (ListView) findViewById(R.id.ListView01);
lv1.setAdapter(new MyCustomBaseAdapter(this, searchResults));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class LoginAction extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
Map<String, String> callArgs = new HashMap<String, String>(1);
callArgs.put("suuid", "dtr0bdQGcqwSh3QO7fVwgVfBNWog6mvEbAyljlLX9E642Yfmur");
try {
response = EventPulseCloud.call("ListEvents", callArgs);
} catch (HttpClientException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JsonException e) {
e.printStackTrace();
}
return response.get("Type").toString();
}
protected void onPostExecute(String result) {
if(result.equals("success")) {
JsonArray records = null;
try {
records = response.getObject ("Data").getArray ("Records");
} catch (JsonException e) {
e.printStackTrace();
}
for(int i = 0; i < records.count(); i++) {
JsonObject record = (JsonObject) records.get(i);
sr1 = new SearchResults();
sr1.setAddress(record.get("address").toString());
results.add(sr1);
}
}
}
}
}
マイリストアダプター:
public class MyCustomBaseAdapter extends BaseAdapter {
private static ArrayList<SearchResults> searchArrayList;
private LayoutInflater mInflater;
public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) {
searchArrayList = results;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return searchArrayList.size();
}
public Object getItem(int position) {
return searchArrayList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.custom_row_view, null);
holder = new ViewHolder();
holder.txtAddress = (TextView) convertView.findViewById(R.id.address);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.txtAddress.setText(searchArrayList.get(position).getAddress());
return convertView;
}
static class ViewHolder {
TextView txtAddress;
}
}
最後に、 SearchResults.java :
public class SearchResults {
private String address = "";
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
}
それで、私は何を間違っていますか?これについて何か考えはありますか?
ありがとうございました。