Android Listview Bilder per Url

  • Antworten:15
Steve Oduala
  • Forum-Beiträge: 8

28.12.2011, 01:36:25 via Website

Guten Abend!

Ich hänge seit 3 Tagen durchgehend bei einem Problem.

1package de.Tab;
2
3import java.io.File;
4import java.io.FileOutputStream;
5import java.io.InputStream;
6import java.net.URL;
7import java.util.ArrayList;
8import java.util.HashMap;
9import java.util.Map;
10
11import android.app.Activity;
12import android.graphics.drawable.Drawable;
13import android.os.Bundle;
14import android.widget.ListView;
15import android.widget.SimpleAdapter;
16
17public class mamaActivity extends Activity {
18 private ListView lv_main;
19 String [] lv_arr_id;
20 private Map<String, Drawable> map;
21
22 @Override
23 public void onCreate(Bundle savedInstanceState) {
24 super.onCreate(savedInstanceState);
25 setContentView(R.layout.main);
26
27 lv_main = (ListView) findViewById(R.id.countries);
28
29 ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();
30 HashMap<String,String> map;
31
32
33
34 map = new HashMap<String, String>();
35 map.put("title", "2nd title");
36 map.put("details", "more details");
37 map.put("cover", String.valueOf(mamaActivity.this.LoadImageFromWebOperations("http://www.google.com/images/srpr/nav_logo37.png")));
38
39
40
41
42
43
44
45
46
47
48
49
50 map = new HashMap<String, String>();
51 map.put("title", "2nd title");
52 map.put("details", "more details");
53 map.put("cover", LoadImageFromWebOperations("http://www.google.com/images/srpr/nav_logo37.png"));
54 listItem.add(map);
55
56 SimpleAdapter mSchedule = new SimpleAdapter (this.getBaseContext(), listItem, R.layout.listbox,
57 new String[] {"cover", "title", "details"}, new int[] {R.id.text1, R.id.text2, R.id.img});
58
59 lv_main.setAdapter(mSchedule);
60 }
61
62
63
64 public static String loadImageFromWebOperations(String url, String path) {
65 try { InputStream is = (InputStream) new URL(url).getContent();
66 System.out.println(path); File f = new File(path);
67 f.createNewFile(); FileOutputStream fos = new FileOutputStream(f);
68 try { byte[] b = new byte[100]; int l = 0;
69 while ((l = is.read(b)) != -1) fos.write(b, 0, l);
70 } catch (Exception e) { } return f.getAbsolutePath();
71 } catch (Exception e) { System.out.println("Exc=" + e);
72 return null; }}
73 }


Warum funktioniert das nicht? Ich habe mir 100000 Tutorials im Internet angeschaut und alle durchprobiert jetzt bin ich mit meinem "Latein" am Ende und benötige Hilfe.

Wie mache ich das das im Listview das Bild erscheint, es kommt immer ein Fehler bei Eclipse

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

28.12.2011, 02:10:34 via App

Hm.
Erstmal wäre es besser gewesen, wenn du genauer beschrieben hättest, wie sich der Fehler äußert..
Was mir so kurz im Code aufgefallen ist: Du speicherst das Bild unter dem Key "cover", gibts bei den From / To Arrays für den Adapter allerdings der Reihenfolge nach den Wert aus "cover" nicht ins R.id.img sondern in ein anderes View Element. Ist das so geplant?
Lg Ansgar

Antworten
Steve Oduala
  • Forum-Beiträge: 8

28.12.2011, 02:26:32 via Website

Dieses LoadImageFromWeb funktioniert nicht.

Wie müssen die 4 Zeilen aussehen ?

map = new HashMap<String, String>();
map.put("title", "2nd title");
map.put("details", "more details");
map.put("cover", LoadImageFromWebOperations("http://www.google.com/images/srpr/nav_logo37.png"));
listItem.add(map);

damit die SCHEISSE endlich klappt. Ich bin echt am austicken schon im Internet lauter Tutorials keines klappt überall andere Antwort ich will nur ein beschissenes Listview wo ich fotos vom web inkludiere das kann ja nicht so schwer sein, jede andere Sprache ist das eine Arbeit von 1 Minute.

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

28.12.2011, 02:30:28 via App

Naja,
fangen wir mal am Anfang an.
Häufigster Fehler: Hast du die Internetpermission im Manifest?
Lg Ansgar

Antworten
Steve Oduala
  • Forum-Beiträge: 8

28.12.2011, 02:34:43 via Website

Japs, habe ich.

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

28.12.2011, 02:42:25 via App

Dann: Wird die Datei richtig geladen und befindet sich unter dem zurückgegebenen Pfad?
Lg Ansgar

Antworten
Steve Oduala
  • Forum-Beiträge: 8

28.12.2011, 02:49:50 via Website

Ja die Datei wird richtig geladen nur wird kein Bild angezeigt in dem Listview.

Antworten
Gelöschter Account
  • Forum-Beiträge: 24

28.12.2011, 11:55:31 via Website

Hmm, ich verstehe einiges in Deinem Code nicht - mag an der gekrüppelten Darstellung liegen:

* Deine Funktion erwartet einen Pfad - der wird aber nicht übergeben. Ich habe mir mal den Seitenquelltext angeschaut - Du übergibst da nichts.

* Die beiden try/catch Blöcke gefallen mir nicht da auch im Fehlerfall der AbsolutePath zurückgeliefert wird - aber ok.

* Ich sehe nur einen add() in die ListView

* Zeig mal die XML von R.layout.listbox

* Änder mal den this.getBaseContext() in getApplicationContext()

Gruß
Harald

Antworten
Gelöschter Account
  • Forum-Beiträge: 24

28.12.2011, 11:59:36 via Website

Nachtrag:

* Beide Codes stimmen nicht überein. Einmal verwendest Du den Funktionsaufruf in Kleinbuchstaben und einmal mit Großbuchstaben. Einmal rufst Du mit this.load... auf und das andere mal nicht. Ich nehme an Du hast verschiedene Testversionen zusammen kopiert und gepostet. Mach das mal sauber.

Gruß
Harald

Antworten
Steve Oduala
  • Forum-Beiträge: 8

28.12.2011, 15:18:05 via Website

Habe es übersichtlicher gemacht & das getApplicationContext() umgeändert.

1package de.Tab;
2
3import java.io.File;
4import java.io.FileOutputStream;
5import java.io.InputStream;
6import java.net.URL;
7import java.util.ArrayList;
8import java.util.HashMap;
9
10import android.app.Activity;
11import android.os.Bundle;
12import android.widget.ListView;
13import android.widget.SimpleAdapter;
14
15public class mamaActivity extends Activity {
16 private ListView lv_main;
17 String [] lv_arr_id;
18
19 @Override
20 public void onCreate(Bundle savedInstanceState) {
21 super.onCreate(savedInstanceState);
22 setContentView(R.layout.main);
23
24 lv_main = (ListView) findViewById(R.id.countries);
25
26 ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();
27 HashMap<String,String> map;
28
29
30 map = new HashMap<String, String>();
31 map.put("title", "2nd title");
32 map.put("details", "more details");
33 map.put("cover", "more details");
34 map.put("cover", LoadImageFromWebOperations("http://www.google.com/images/srpr/nav_logo37.png"));
35 listItem.add(map);
36
37 map = new HashMap<String, String>();
38 map.put("title", "2nd title");
39 map.put("details", "more details");
40 map.put("cover", "more details");
41 map.put("cover", LoadImageFromWebOperations("http://www.google.com/images/srpr/nav_logo37.png"));
42 listItem.add(map);
43
44 SimpleAdapter mSchedule = new SimpleAdapter (this.getApplicationContext(), listItem, R.layout.listbox,
45 new String[] {"title", "details", "cover"}, new int[] {R.id.text1, R.id.text2, R.id.img});
46
47 lv_main.setAdapter(mSchedule);
48 }
49
50
51
52 public static String loadImageFromWebOperations(String url, String path) {
53
54 try {
55
56 InputStream is = (InputStream) new URL(url).getContent();
57 System.out.println(path);
58 File f = new File(path);
59 f.createNewFile();
60 FileOutputStream fos = new FileOutputStream(f);
61
62 try {
63
64 byte[] b = new byte[100];
65 int l = 0;
66
67 while ((l = is.read(b)) != -1)
68 fos.write(b, 0, l);
69
70 } catch (Exception e) {
71
72 } return f.getAbsolutePath();
73 } catch (Exception e) {
74 System.out.println("Exc=" + e);
75 return null; }
76 }
77 }

In den Zeilen wo LoadImageFromWEbOperations ist gibt es jeweils einen Fehler. ( The Method LoadImage...... is undefinded from the mamaActivity.

Wenn ich die beiden Zeilen auskommentier und die APP im, Emulator starte funkt sie, nur wenn ich dann auf das TAB gehe Schließt sich die App.


1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 android:layout_width="wrap_content"
5 android:orientation="horizontal"
6 android:layout_height="wrap_content">
7 <LinearLayout
8 android:layout_width="240dip"
9 android:orientation="vertical"
10 android:layout_height="wrap_content">
11 <TextView android:layout_width="fill_parent"
12 android:layout_height="wrap_content"
13 android:id="@+id/text1"
14 android:textSize="25dip"
15 android:text="This is text1"/>
16 <TextView android:layout_width="fill_parent"
17 android:layout_height="wrap_content"
18 android:id="@+id/text2"
19 android:textSize="10dip"
20 android:text="This is text2"/>
21
22 </LinearLayout>
23 <ImageView android:layout_width="55dip"
24 android:layout_height="fill_parent"
25 android:id="@+id/img"
26
27 />
28</LinearLayout>

Das ist der Code von listbox.xml

Antworten
Gelöschter Account
  • Forum-Beiträge: 24

28.12.2011, 15:34:39 via Website

Ich hatte wohl zu viele Punkte aufgeführt. Der erste war:

* Deine Funktion erwartet einen Pfad - der wird aber nicht übergeben. Ich habe mir mal den Seitenquelltext angeschaut - Du übergibst da nichts.

Also noch mal in Klartext. Du rufst eine statische Methode mit einem einzelnen Parameter auf deren Signatur aber zwei Parameter erwartet. Deshalb gibt es die von Dir aufgerufene Methode auch nicht in der Activity. Außerdem ist die Methode immer noch unterschiedlich geschrieben - einmal mit führendem Großbuchstaben und einmal mit führendem Kleinbuchstaben.

1LoadImageFromWebOperations("http://www.google.com/images/srpr/nav_logo37.png")
2// versus
3public static String loadImageFromWebOperations(String url, String path)

Gruß
Harald

Antworten
Steve Oduala
  • Forum-Beiträge: 8

28.12.2011, 15:59:53 via Website

Okay, Danke für den Hinweis.

Aber welchen Pfad soll ich angeben?

map.put("cover", loadImageFromWebOperations("http://www.google.com/images/srpr/nav_logo37.png", "images.jpg")); So funktioniert es ohne das Fehler angezeigt werden.

Jedoch beim Starten im Emulator funkt die APP aber wiederum bei öffnen des Betreffenden Tabs Schließt sie sich.

EDIT: UPS, hatte kleinen Fehler drinnen R.layout.see!

So jetzt funkt es aber es wird kein Bild angezeigt nur 2nd title & more details also der Text.

— geändert am 28.12.2011, 16:02:06

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

28.12.2011, 16:34:43 via App

Natürlich läuft das schief, weil du in der Methode im zweiten übergebenen String den Pfad, wo gespeichert werden soll, übergeben sollst. Deine App hat keine Schreibrechte fürs root-Verzeichnis..
Lg Ansgar

Antworten
Steve Oduala
  • Forum-Beiträge: 8

28.12.2011, 16:52:51 via Website

Wie muss ich es dann abändern, ich möchte ja eig garnicht die Bilder speichern sondern nur anzeigen lassen?

Antworten
Gelöschter Account
  • Forum-Beiträge: 24

28.12.2011, 17:41:18 via Website

Über kurz oder lang kommst Du mit Deinem Ansatz ohnehin an Grenzen. Kommen die Bilder auch später aus dem Web? Wenn ja, wie viele können das denn so werden und wie groß (auch im Sinne der Skalierung) sind die so? Du wirst ...

* beim Zugriff aufs Web einen Thread einrichten müssen. Bis 3.x wird das auch so klappen aber ab 3.x wird Deine App Fehler schmeißen (da kommt noch einiges durch alte Apps auf uns zu) ...

* bei umfangreicheren Bildbeständen einen LazyLoad benötigen ...

* bei größeren Bildern skalieren müssen da Android ziemlich empfindlich ist was den Speicher angeht ...

Es gibt im Web zillionen Beispiele für solche Dinge. Schau mal bei StackOverflow - da wirst Du mit Diskussionen und Beispielen und Links zugeworfen.

Auch hier gibt es Text dazu ("Gelöschter Account" bin ich):

https://www.nextpit.de/de/android/forum/thread/430361/Best-Practice-Daten-aus-Web-in-ListView-laden
https://www.nextpit.de/de/android/forum/thread/438961/OutOfMemory

Gruß
Harald

Antworten
Steve Oduala
  • Forum-Beiträge: 8

28.12.2011, 17:49:33 via Website

Es werden höchstens 10 Bilder kommen pro Aufruf. Die Bilder stammen von YouTube, und zwar die Default Bilder zu den Videos.

Ich guck mir mal Deine Links an.

Antworten