{"id":376,"date":"2014-02-02T00:16:15","date_gmt":"2014-02-01T15:16:15","guid":{"rendered":"http:\/\/www.typea.info\/blog\/index.php\/2014\/02\/02\/android_listfragment_asynctaskloader\/"},"modified":"2014-02-02T00:16:15","modified_gmt":"2014-02-01T15:16:15","slug":"android_listfragment_asynctaskloader","status":"publish","type":"post","link":"https:\/\/www.typea.info\/blog\/index.php\/2014\/02\/02\/android_listfragment_asynctaskloader\/","title":{"rendered":"Android ListFragment \u3068 AsyncTaskLoader \u306e\u30e1\u30e2"},"content":{"rendered":"<p>&#160;<\/p>\n<p>AysncTaskLoader \u3092\u4f7f\u7528\u3057\u3066\u975e\u540c\u671f\u306b\u3001<a href=\"http:\/\/atnd.org\/doc\/api.html\">ATND \u306e Web\u30b5\u30fc\u30d3\u30b9<\/a>\u304b\u3089XML\u3092\u53d6\u5f97\u3057\u3066\u8868\u793a\u3059\u308b\u30e1\u30e2\u3002<\/p>\n<p>Activity \u3084 Fragment \u306b\u306f\u3001\u30b5\u30dd\u30fc\u30c8\u30e9\u30a4\u30d6\u30e9\u30ea(android.support.v4) \u3092\u5229\u7528\u3057\u3066\u3044\u308b\u3002<\/p>\n<p>\u4f5c\u308a\u304c\u9762\u5012\u304f\u3055\u3044\u3051\u3069\u3001\u307e\u305f\u304d\u3063\u3068\u4f7f\u3046\u3053\u3068\u304c\u3042\u308b\u3068\u601d\u3046\u306e\u3067\u30e1\u30e2\u3057\u3066\u304a\u304f\u3002<\/p>\n<h3>Activity<\/h3>\n<p>\u57fa\u672c\u7684\u306b\u306f\u4e00\u5f0f\u3053\u3053\u306b\u653e\u308a\u8fbc\u3093\u3067\u3042\u308b\u3002<\/p>\n<p>XML\u306e\u89e3\u6790\u306b\u306f\u3001<a href=\"http:\/\/simple.sourceforge.net\/\">Simple<\/a> \u3092\u5229\u7528\u3002Event \u30af\u30e9\u30b9\u306fATND\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u8868\u3059POJO\u3002<\/p>\n<pre class=\"prettyprint linenums\">package info.typea.atndcalendar;\r\n\r\nimport info.typea.atndcalendar.model.atnd.Event;\r\nimport info.typea.atndcalendar.model.atnd.EventSearchResponse;\r\n\r\nimport java.io.BufferedReader;\r\nimport java.io.InputStream;\r\nimport java.io.InputStreamReader;\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport org.apache.http.HttpResponse;\r\nimport org.apache.http.NameValuePair;\r\nimport org.apache.http.client.entity.UrlEncodedFormEntity;\r\nimport org.apache.http.client.methods.HttpPost;\r\nimport org.apache.http.impl.client.DefaultHttpClient;\r\nimport org.apache.http.message.BasicNameValuePair;\r\nimport org.apache.http.protocol.HTTP;\r\nimport org.simpleframework.xml.Serializer;\r\nimport org.simpleframework.xml.core.Persister;\r\n\r\nimport android.content.Context;\r\nimport android.os.Bundle;\r\nimport android.support.v4.app.FragmentActivity;\r\nimport android.support.v4.app.FragmentManager;\r\nimport android.support.v4.app.ListFragment;\r\nimport android.support.v4.app.LoaderManager;\r\nimport android.support.v4.content.AsyncTaskLoader;\r\nimport android.support.v4.content.Loader;\r\nimport android.util.Log;\r\nimport android.view.LayoutInflater;\r\nimport android.view.Menu;\r\nimport android.view.View;\r\nimport android.view.ViewGroup;\r\nimport android.widget.ArrayAdapter;\r\nimport android.widget.TextView;\r\n\r\npublic class AtndCalendarActivity extends FragmentActivity {\r\n\r\n    @Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_atnd_calendar);\r\n        \r\n        FragmentManager fm = getSupportFragmentManager();\r\n        \r\n        if (fm.findFragmentById(android.R.id.content) == null) {\r\n        \tEventFragment list = new EventFragment();\r\n        \tfm.beginTransaction().add(android.R.id.content, list).commit();\r\n        }\r\n    }\r\n\r\n    @Override\r\n    public boolean onCreateOptionsMenu(Menu menu) {\r\n        \/\/ Inflate the menu; this adds items to the action bar if it is present.\r\n        getMenuInflater().inflate(R.menu.atnd_calendar, menu);\r\n        return true;\r\n    }\r\n\t\r\n\tpublic static class EventListAdapter extends ArrayAdapter<event> {\r\n\r\n\t\tprivate final LayoutInflater inflater;\r\n\t\t\r\n\t\tpublic EventListAdapter(Context context) {\r\n\t\t\tsuper(context, android.R.layout.simple_list_item_2); \r\n\t\t\tinflater = (LayoutInflater)context\r\n\t\t\t\t\t.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r\n\t\t}\r\n\r\n\t\tpublic void setData(List<event> entities) {\r\n\t\t\tclear();\r\n\t\t\tif (entities != null) {\r\n\t\t\t\tfor (Event entity : entities) {\r\n\t\t\t\t\tadd(entity);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic View getView(int position, View convertView, ViewGroup parent) {\r\n\t\t\tView view;\r\n\t\t\tif (convertView == null) {\r\n\t\t\t\tview = inflater.inflate(R.layout.event_item, parent, false);\r\n\t\t\t} else {\r\n\t\t\t\tview = convertView;\r\n\t\t\t}\r\n\t\t\r\n\t\t\tEvent item = getItem(position);\r\n\t\t\t((TextView)view.findViewById(R.id.txt_event))\r\n\t\t\t\t.setText(item.getTitle());\r\n\t\t\t\t\r\n\t\t\treturn view;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static class EventFragment extends ListFragment \r\n\t\timplements LoaderManager.LoaderCallbacks<list><event>&gt; {\r\n\r\n\t\tprivate EventListAdapter eventAdapter;\r\n\r\n\t\t@Override\r\n\t\tpublic void onActivityCreated(Bundle savedInstanceState) {\r\n\t\t\tsuper.onActivityCreated(savedInstanceState);\r\n\t\t\r\n\t\t\tsetEmptyText(&quot;No Event&quot;);\r\n\t\t\t\r\n\t\t\teventAdapter = new EventListAdapter(getActivity());\r\n\t\t\tsetListAdapter(eventAdapter);\r\n\t\t\t\r\n\t\t\tsetListShown(false);\r\n\t\t\t\r\n\t\t\tgetLoaderManager().initLoader(0, null, this);\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic Loader<list><event>&gt; onCreateLoader(int id, Bundle args) {\r\n\t\t\treturn new EventLoader(getActivity());\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic void onLoadFinished(Loader<list><event>&gt; loader, List<event> data) {\r\n\t\t\t\r\n\t\t\teventAdapter.setData(data);\r\n\t\t\tsetListShown(true);\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic void onLoaderReset(Loader<list><event>&gt; loader) {\r\n\t\t\teventAdapter.setData(null);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static class EventLoader extends AsyncTaskLoader<list><event>&gt; {\r\n\r\n\t\tpublic static final String EVENT_SEARCH_URL = &quot;http:\/\/api.atnd.org\/eventatnd\/event\/&quot;;\r\n\r\n\t\tpublic EventLoader(Context context) {\r\n\t\t\tsuper(context);\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic List<event> loadInBackground() {\r\n\t\t\t\r\n\t\t\tList<event> list = new ArrayList<event>();\r\n\t\t\t\r\n\t\t\ttry {\r\n\t\t\t\tList<namevaluepair> queryParms = new ArrayList<namevaluepair>();\r\n\t\t\t\tqueryParms.add(new BasicNameValuePair(&quot;format&quot;, &quot;xml&quot;));\r\n\t\t\t\tqueryParms.add(new BasicNameValuePair(&quot;keyword&quot;, &quot;python&quot;)); \/\/todo\r\n\t\t\t\t\r\n\t\t\t\tHttpPost post = new HttpPost(EVENT_SEARCH_URL);\r\n\t\t\t\tpost.setEntity(new UrlEncodedFormEntity(queryParms,HTTP.UTF_8));\r\n\t\t\t\tDefaultHttpClient client = new DefaultHttpClient();\r\n\t\t\t\tHttpResponse res = client.execute(post);\r\n\t\t\t\t\r\n\t\t\t\tInputStream in = res.getEntity().getContent();\r\n\r\n\t\t\t\tStringBuilder buf = new StringBuilder();\r\n\t\t\t\tBufferedReader reader = new BufferedReader(new InputStreamReader(in));\r\n\t\t\t\tString l = null;\r\n\t\t\t\twhile((l = reader.readLine()) != null) {\r\n\t\t\t\t\tbuf.append(l).append(&quot;\\r\\n&quot;);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tSerializer serializer = new Persister();\r\n\t\t\t\tEventSearchResponse hash \r\n\t\t\t\t\t= serializer.read(EventSearchResponse.class, buf.toString());\r\n\t\t\t\t\r\n\t\t\t\treturn hash.getEvents();\r\n\r\n\t\t\t} catch (Exception e){\r\n\t\t\t\tLog.e(&quot;atnd&quot;,&quot;&quot;, e);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn list;\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tprotected void onStartLoading() {\r\n\t\t\tforceLoad();\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tprotected void onStopLoading() {\r\n\t\t\tcancelLoad();\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic void reset() {\r\n\t\t\tsuper.reset();\r\n\t\t\tonStopLoading();\r\n\t\t}\r\n\t}\r\n}<\/pre>\n<h3>Activity\u306e\u30ec\u30a4\u30a2\u30a6\u30c8<\/h3>\n<p>activity_atnd_calendar.xml<\/p>\n<pre class=\"prettyprint linenums\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;LinearLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\r\n    android:layout_width=&quot;fill_parent&quot;\r\n    android:layout_height=&quot;fill_parent&quot;\r\n    android:orientation=&quot;vertical&quot; &gt;\r\n\r\n    &lt;fragment\r\n        android:id=&quot;@+id\/fragment_event&quot;\r\n        android:name=&quot;info.typea.atndcalendar.AtndCalendarActivity$EventFragment&quot;\r\n        android:layout_width=&quot;match_parent&quot;\r\n        android:layout_height=&quot;wrap_content&quot; \/&gt;\r\n\r\n&lt;\/LinearLayout&gt;<\/pre>\n<h3>\u30ea\u30b9\u30c8\u30a2\u30a4\u30c6\u30e0\u306e\u30ec\u30a4\u30a2\u30a6\u30c8<\/h3>\n<p>event_item.xml<\/p>\n<pre class=\"prettyprint linenums\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;LinearLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\r\n    android:layout_width=&quot;match_parent&quot;\r\n    android:layout_height=&quot;match_parent&quot;\r\n    android:orientation=&quot;vertical&quot; &gt;\r\n\r\n    &lt;TextView\r\n        android:id=&quot;@+id\/txt_event&quot;\r\n        android:layout_width=&quot;wrap_content&quot;\r\n        android:layout_height=&quot;wrap_content&quot;\r\n        android:text=&quot;&quot; \/&gt;\r\n\r\n&lt;\/LinearLayout&gt;<\/pre>\n<p>&#160;<\/p>\n<p>\u8d77\u52d5\u6642\u306b\u30ea\u30b9\u30c8\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u308b\u3002<\/p>\n<p><a href=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/ad7d83234e1f_14FF8\/atnd_event_load.png\"><img loading=\"lazy\" decoding=\"async\" title=\"atnd_event_load\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"atnd_event_load\" src=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/ad7d83234e1f_14FF8\/atnd_event_load_thumb.png\" width=\"139\" height=\"244\" \/><\/a><\/p>\n<p>\u8aad\u307f\u8fbc\u307e\u308c\u305f\u3002<\/p>\n<p><a href=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/ad7d83234e1f_14FF8\/atend_event_loaded.png\"><img loading=\"lazy\" decoding=\"async\" title=\"atend_event_loaded\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"atend_event_loaded\" src=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/ad7d83234e1f_14FF8\/atend_event_loaded_thumb.png\" width=\"139\" height=\"244\" \/><\/a><\/p>\n<p>\u4ee5\u4e0b\u306e\u66f8\u7c4d\u3092\u53c2\u8003\u306b\u3002<\/p>\n<p><iframe style=\"height: 240px; width: 120px\" marginheight=\"0\" src=\"http:\/\/rcm-fe.amazon-adsystem.com\/e\/cm?lt1=_blank&amp;bc1=FFFFFF&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=typea09-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=486354104X\" frameborder=\"0\" marginwidth=\"0\" scrolling=\"no\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#160; AysncTaskLoader \u3092\u4f7f\u7528\u3057\u3066\u975e\u540c\u671f\u306b\u3001ATND \u306e Web\u30b5\u30fc\u30d3\u30b9\u304b\u3089XML\u3092\u53d6\u5f97\u3057\u3066\u8868\u793a\u3059\u308b\u30e1\u30e2\u3002 Activity \u3084 Fragment \u306b\u306f\u3001\u30b5\u30dd\u30fc\u30c8\u30e9\u30a4\u30d6\u30e9\u30ea(android.supp [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"sns_share_botton_hide":"","vkExUnit_sns_title":"","_vk_print_noindex":"","sitemap_hide":"","_veu_custom_css":"","veu_display_promotion_alert":"","vkexunit_cta_each_option":"","footnotes":""},"categories":[39],"tags":[],"class_list":["post-376","post","type-post","status-publish","format-standard","hentry","category-android"],"veu_head_title_object":{"title":"","add_site_title":""},"_links":{"self":[{"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/posts\/376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=376"}],"version-history":[{"count":0,"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/posts\/376\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}