Driel Posté(e) 14 octobre 2011 Share Posté(e) 14 octobre 2011 Bonjour, J'ai un petit problème. Actuellement je développe une application test sur android (un catalogue de produit). De fait, je génère une liste des top 10 des produits vendus, que je récupère via un webService et Json. Jusque là, pas de problème, tout fonctionne à merveille. Le pépin, c'est que dans ma listView j'ai un imageView, où j'aimerais afficher l'image de chaque produit, en sachant que cette image est récupérée via une servlet sur un serveur distant et en fonction de l'id du produit. Alors, écrire le lien, c'est ok. Mais le truc c'est envoyer le lien (avec l'appel à la servlet dedans), récupérer l'image et la "convertir" en String, de manière à pouvoir la stocker dans une hashmap<String, String> dont je me sers pour générer le contenu de la listView. Ci joint mon activity bestSales (la fonction retrieveStream est une fonction décrite ailleurs dans la classe, mais n'est pas essentiel ici, en gros elle sert à demander les infos au serveur) La partie appel à la servlet et là où je bloque sont en dessous des commentaires public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.best_sales); mBestSales = (ListView) findViewById(R.id.listViewBS); mUrl = mUrl + "/produit/top"; InputStream lSource = retrieveStream(mUrl); Gson lGon = new Gson(); Reader lReader = new InputStreamReader(lSource); TopProduit[] lListeProduits = lGon .fromJson(lReader, TopProduit[].class); ArrayList<HashMap<String, String>> lListItems = new ArrayList<HashMap<String, String>>(); HashMap<String, String> map; for (TopProduit lProduit : lListeProduits) { map = new HashMap<String, String>(); map.put("id", lProduit.getProduit().getId().toString()); map.put("titre", lProduit.getProduit().getTitle()); map.put("compo", lProduit.getProduit().getComposition().getNom()); // Ici, appel à ma Servlet, je l'ai testée, elle est fonctionnelle quand je met le lien en dur dans le navigateur // le résultat doit être mis dans ma hashmap, juste.... String lUrlImage = "http://monUrl/MaServlet?id_produit=" + lProduit.getProduit().getId() + "&fichier=IMAGE_PRINCIPALE"; //..... ici, je dois mettre l'image au format string map.put("img", String.valueOf(lUrlImage)); lListItems.add(map); } SimpleAdapter mSchedule = new SimpleAdapter(this.getBaseContext(), lListItems, R.layout.best_sales_item, new String[] { "img", "titre", "compo" }, new int[] { R.id.imgBS, R.id.titreBS, R.id.compoBS }); mBestSales.setAdapter(mSchedule); mBestSales .setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override @SuppressWarnings("unchecked") public void onItemClick(AdapterView<?> a, View v, int position, long id) { // on récupère la HashMap contenant les infos de notre // item (titre, description, img) HashMap<String, String> map = (HashMap<String, String>) mBestSales .getItemAtPosition(position); // on créer une boite de dialogue Bundle lBundle = new Bundle(); lBundle.putString("id", map.get("id")); Intent lIntent = new Intent(BestSalesActivity.this, ProduitByIdActivity.class); lIntent.putExtras(lBundle); startActivityForResult(lIntent, CODE_DE_MON_ACTIVITE); } }); } Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Vicnet31 Posté(e) 14 octobre 2011 Share Posté(e) 14 octobre 2011 (modifié) Salut, J'ai trouvé ce code sur le net qui semble correspondre à ce que tu veux, non ? URLConnection connection = uri.toURL().openConnection(); connection.connect(); InputStream is = connection.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is, 8 * 1024); Bitmap bmp = BitmapFactory.decodeStream(bis); bis.close(); is.close(); Ce que te sort le inputstream, ou plutot un InputStreamReader est à placer dans ta map. Modifié 14 octobre 2011 par Vicnet31 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Driel Posté(e) 15 octobre 2011 Auteur Share Posté(e) 15 octobre 2011 ça a l'air pas mal, j'ai essayé pas mal de truc déjà donc je prend un peu ce qui vient ^^ Merci de ta réponse en tout cas :) Par contre, que signifie 8 * 1024 là dedans BufferedInputStream bis = new BufferedInputStream(is, 8 * 1024); ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Vicnet31 Posté(e) 17 octobre 2011 Share Posté(e) 17 octobre 2011 Salut, A priori, c'est specifique à l'appli dans laquelle j'ai récupéré le code, du style fichier image de 1024 pixels en 8 couleurs ?!? Ou quelque chose comme cela. Le BufferedInputStream comme son nom l'indique, utilise un buffer tampon pour lire les données, ce qui limite les accès disques/reseaux. Tu peux mettre ce que tu veux pour cette valeur sachant que plus c'est grand, plus c'est rapide mais plus tu consomes de la mémoire... Si la taille des données dépassent celle du buffer, au moment du read le inputStream videra le buffer et le recharera en faisant un acces disque/reseau. Donc pas de pb de taille min ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Driel Posté(e) 24 octobre 2011 Auteur Share Posté(e) 24 octobre 2011 Merci beaucoup pour ton aide et tes explications, et désolé pour ma réponse tardive. j'essaierai ça dans la semaine et ferai part des retours Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Driel Posté(e) 17 novembre 2011 Auteur Share Posté(e) 17 novembre 2011 Tardivement, mais voici mon report par rapport au problème que j'ai posé sur ce sujet. Le morceau de code donné plus haut ne fonctionnant pas, j'ai donc continué mes recherches (sur le Web et dans mon coin) et j'ai trouvé une solution qui fonctionne. Rappelez-vous, je cherchais à télécharger mes images depuis un serveur distant et à les ajouter dynamiquement dans une hashmap, puis à convertir cette hashmap de manière à la caser à dans un listView (c'est un peu pèle-mêle comme explication, mais cf mon code au début du topic) Voici le morceau de code m'ayant aidé public static String loadImageFromWebOperations(String url, String path) { try { InputStream is = (InputStream) new URL(url).getContent(); System.out.println(path); File f = new File(path); if (!f.exists()) { f.createNewFile(); FileOutputStream fos = new FileOutputStream(f); try { byte[] b = new byte[100]; int l = 0; while ((l = is.read(B)) != -1) fos.write(b, 0, l); } catch (Exception e) { e.printStackTrace(); } } return f.getAbsolutePath(); } catch (Exception e) { System.out.println("Exc=" + e); return null; } } Lors du parcours de ma liste de produit, au moment où je dois récupérer l'image, je fait appel à cette méthode. Les paramètres url et path sont spécifié lors de l'appel, l'url étant l'adresse web de l'image sur le serveur et le path étant le chemin où le fichier image sera stocké sur la sd (oui, j'ai aussi ajouté une sd et les autorisation qui vont avec(Write external storage)) Je récupère l'url, instancie une variable de type file puis vérifie son existence de manière à éviter de télécharger les images déjà existantes. Je ne peux pas expliquer le traitement ensuite mais je retourne une variable de type string comprenant le chemin du fichier (par exemple: \sdcard\produit\54, où 54 est l'id de mon produit, ce qui me permet de pas mélanger les images). Je retourne le chemin puisque ceci sera stocké dans ma hashmap puis attribué à un imageView qui est un composant n'acceptant que les string, il s'occupera donc de résoudre le chemin vers l'image lui même. Voilà, si quelqu'un à une idée rapport au redimensionnement de l'image à la volée, ça serait un petit plus non négligeable ! En attendant, et je poursuis mes recherches sur ça aussi, merci pour l'aide apportée Vicnet31 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Driel Posté(e) 18 novembre 2011 Auteur Share Posté(e) 18 novembre 2011 Pour le redimensionnement de l'image dans mon listView, j'ai trouvé comme faire, je laisse ici, peut-être que ça aidera quelqu'un. En fait, dans l'imageView où l'on va mettre l'image, il faut ajouter les valeurs ci dessous android:adjustViewBounds="true" android:maxHeight="90px" Bien entendu, le maxHeight peut être différent et on peut très bien ne pas le mettre et le remplacer par autre chose Voilà, en espérant que ça servira à d'autres Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cp777 Posté(e) 23 novembre 2011 Share Posté(e) 23 novembre 2011 (modifié) Il est parfois interessant de voir comment les professionnels travaillent dans cette direction notamment avec le digital signage. Pour moi en effet il est intéressant de voir quels sont leurs projets et comment il le mettent à bien. Et pourquoi pas même les contacter afin d'obtenir d'avantages de détails et d'informations... Ils publient souvent une liste de leurs clients, de leurs projets et cela peut être très utile pour une étude de cas. :lol: Modifié 23 novembre 2011 par cp777 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.