{"id":288,"date":"2010-04-22T06:49:29","date_gmt":"2010-04-22T05:49:29","guid":{"rendered":"http:\/\/www.webmaid.de\/?p=288"},"modified":"2010-04-22T06:49:29","modified_gmt":"2010-04-22T05:49:29","slug":"listactivity-und-listadapter","status":"publish","type":"post","link":"https:\/\/www.webmaid.de\/2010\/04\/listactivity-und-listadapter\/","title":{"rendered":"ListActivity und ListAdapter – keine Geheimnisse in Android"},"content":{"rendered":"
Um eine Liste von Eintr\u00e4gen anzeigen zu lassen, bietet Android die M\u00f6glichkeit der ListActivity. Eine einfache ListActivity<\/a> mit einer statischen Menge von Eintr\u00e4gen ist schnell implementiert; eine komplexe ListActivity mit eigenem ListAdapter und Performanceproblemen leider auch. Dies wir aber nur selten der Fall sein und auch in diesem Beispiel benutzen wir bereits einen ArrayAdapter<\/a>, der die Methode getView implementiert und sich entsprechend performant um die Darstellung k\u00fcmmert. In den meisten F\u00e4llen werden die Daten aus einer Datenbank stammen oder von einer anderen Datenquelle, die einen Cursor bereitstellt. F\u00fcr diese Eventualit\u00e4t stellt Android den SimpleCursorAdapter bereit; dieser Adapter mappt eine Menge von Columns (der Datenquelle) auf eine Menge von Ids von Views.<\/p>\n Okay nun haben wir eine einfache Liste mit einer Menge von Eintr\u00e4gen, die immer gleich aussehen. Meist reicht dies schon. Will man jetzt mehr Einfluss haben, dann muss man einen eigenen ListAdapter<\/a> entwickeln und die getView – Methode implementieren. Hier ist aber Vorsicht geboten. getView wird h\u00e4ufiger aufgerufen, als man sich vielleicht vorstellen kann. Auf der Developer Conference hat Romain Guy einen Vortrag<\/a> \u00fcber „Turbo-charge your UI: How to Make your Android UI Fast and Efficient“ gehalten und ist genau auf diesen Punkt eingegangen. Die wichtigsten Punkte sind:<\/p>\n Ich will hier kurz einmal die schlechteste Implementierung anrei\u00dfen; wenn ihr Performanceprobleme habt und eure Implementierung \u00e4hnelt dem folgenden Beispiel, dann habt ihr noch ein wenig Arbeit vor euch.<\/p>\n Es wird bei diesem Code entweder zu der Fehlermeldung kommen, dass die Anwendung nicht mehr reagiert oder beim Scrollen wird die Anwendung h\u00e4ngen bleiben da der Garbage Collector die alten View st\u00e4ndig wegl\u00f6schen muss. Romain Guy gibt an, dass alleine die erste Zeile 50ms Rechenzeit in Anspruch nimmt (auf seinem Google G1). <\/p>\n Ihr werdet sehr oft merken, dass eine Handy-CPU nicht so schnell ist, wie ein Desktop-PC (auch wenn man das eigentlich schon vorher wissen sollte) und eure „Programmlogiken“ in Tasks auslagern<\/a>; mein erster Ber\u00fchrungspunkt mit Tasks kam sehr schnell, da ich in meiner ersten App eine Gallery mit Fotos anzeigen lassen wollte und man nicht die Originalfotos einfach nehmen kann und die Thumbnails einem auch nicht bereitgestellt werden. <\/p>\n Es gibt also keine Geheimnisse in Android, aber man muss teilweise lange Suchen, um die richtigen Antworten zu finden, da die API – Dokumentation doch recht wortkarg ist (z.B. MediaStore.Images.Media#query<\/a>).<\/p>\n","protected":false},"excerpt":{"rendered":" Ein kleines Beispiel wie man in Android eine ListActivity und einen ListAdapter nutzen kann, um eine Menge von Eintr\u00e4gen anzeigen zu lassen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,3],"tags":[91],"_links":{"self":[{"href":"https:\/\/www.webmaid.de\/wp-json\/wp\/v2\/posts\/288"}],"collection":[{"href":"https:\/\/www.webmaid.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webmaid.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webmaid.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webmaid.de\/wp-json\/wp\/v2\/comments?post=288"}],"version-history":[{"count":10,"href":"https:\/\/www.webmaid.de\/wp-json\/wp\/v2\/posts\/288\/revisions"}],"predecessor-version":[{"id":298,"href":"https:\/\/www.webmaid.de\/wp-json\/wp\/v2\/posts\/288\/revisions\/298"}],"wp:attachment":[{"href":"https:\/\/www.webmaid.de\/wp-json\/wp\/v2\/media?parent=288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webmaid.de\/wp-json\/wp\/v2\/categories?post=288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webmaid.de\/wp-json\/wp\/v2\/tags?post=288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}
\n<\/p>\n\r\npublic class SimpleStaticListActivity extends ListActivity {\r\n\/\/ ...\r\n private static String[] listEntries = new String[] {\"1. Eintrag\", \"2. Eintrag\", \"3. Eintrag\", \"4. Eintrag\"};\r\n public void onCreate() {\r\n super.onCreate(savedInstanceState);\r\n \/\/ dein Layout\r\n\t\tsetContentView(R.layout.simpleStaticList);\r\n \/\/ der List-Adapter\r\n setListAdapter(new ArrayAdapter(this, R.id.TextView01, listEntries));\r\n }\r\n}\r\n<\/code><\/pre>\n
\r\npublic class SimpleCursorAdapterListActivity extends ListActivity {\r\n\/\/ ...\r\n public void onCreate() {\r\n super.onCreate(savedInstanceState);\r\n \/\/ dein Layout\r\n\t\tsetContentView(R.layout.simpleStaticList);\r\n \/\/ dbHelper ^= Facade zur Datenbank\r\n Cursor entries = dbHelper.getEntries();\r\n \/\/ Wichtig: Android k\u00fcmmert sich um den Lifecycle des Cursors\r\n startManagingCursor(entries);\r\n SimpleCursorAdapter entryAdapter = new SimpleCursorAdapter(this, R.layout.row, entries, new String[] {\"_id\"}, new int[] {R.id.TextView01});\r\n setListAdapter(entryAdapter);\r\n }\r\n}\r\n<\/code><\/pre>\n
\n
\r\npublic class SlowCursorAdapter implements ListAdapter {\r\n\/\/ ...\r\n public View getView(int position, View convertView, Viewgroup parent) {\r\n \/\/ mInflater ^= android.view.LayoutInflater\r\n View view = mInflater.inflate(R.layout.listItem, null);\r\n ((TextView) view.findItemById(R.id.textView01)).setText(position + \" Eintrag\");\r\n return view;\r\n }\r\n<\/code><\/pre>\n