2011-10-01 8 views
0

Je travaille sur un projet qui communique avec le serveur web et télécharge quelques photos. Je veux que ces photos soient montrées sur un listview après le téléchargement, mais il me jette un NullPointerException. Voici le code que je utilise:Android set Image Bitmap question

private ArrayList <HashMap<String, Object>> items; 
    private static final String NAMEKEY = "bookname"; 
    private static final String INFOKEY = "bookprice"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mystampii_layout); 
    } 
     }); 

     ListView listView = (ListView)findViewById(R.id.mystampii_listview); 
     items = new ArrayList<HashMap<String,Object>>(); 
     HashMap<String, Object> hm; 


     final Bitmap b = BitmapFactory.decodeFile("/sdcard/MediaCard2a44bb1f782925923195ee546e7ef395.jpg", null); 
     ImageView brum = (ImageView) findViewById(R.id.main_img); 
     brum.setImageBitmap(b); 


     hm = new HashMap<String, Object>(); 
     hm.put(NAMEKEY, "Moto GP 2010"); 
     hm.put(INFOKEY, "98 Stampii"); 
     items.add(hm); 

      // Define SimpleAdapter and Map the values with Row view R.layout.listbox 
      SimpleAdapter adapter = new SimpleAdapter(this, items, R.layout.main_listview, 
        new String[]{NAMEKEY,INFOKEY}, new int[]{R.id.main_img,R.id.main_name, R.id.main_info}); 

      listView.setAdapter(adapter); 
      listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    } 

Je sais pourquoi je suis en train de NullPointerException: parce que mon ImageView brum est placé dans R.layout.main_listview et je suis mise en tant que contenu de cette activité R.layout.mystampii_layout. Je peux vraiment avoir l'idée comment définir l'image de SDCard à un ImageView d'une autre mise en page.

Toutes les suggestions comment je peux faire cela, ou comment puis-je montrer l'image téléchargée de SDCard dans listview.

Merci vraiment pour toute sorte d'aide !!!

+0

Jetez un oeil à [Liste de chargement Lazy de Fedor] (http://stackoverflow.com/questions/541966/android-how-do-i-do-a-lazy-load-of-images-in-listview/ 3068012 # 3068012) –

Répondre

0

Créer votre adaptateur personnalisé comme celui-ci:

import java.util.ArrayList; 

import com.stampii.stampii.R; 
import com.stampii.stampii.comm.rpc.CollectionRPCPacket; 
import com.stampii.stampii.comm.rpc.UserDatabaseHelper; 

import android.app.Activity; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class MyArrayAdapter extends ArrayAdapter<String> { 
    private final Activity context; 
    private final String[] names; 
    CollectionRPCPacket rpcPacket; 
    Cursor cursor; 
    String title; 

    public MyArrayAdapter(Activity context, String[] names) { 
     super(context, R.layout.main_listview, names); 
     this.context = context; 
     this.names = names; 
    } 

    // static to save the reference to the outer class and to avoid access to 
    // any members of the containing class 
    static class ViewHolder { 
     public ImageView imageView; 
     public TextView textView,textView2; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // ViewHolder will buffer the assess to the individual fields of the row 
     // layout 

     ViewHolder holder; 
     // Recycle existing view if passed as parameter 
     // This will save memory and time on Android 
     // This only works if the base layout for all classes are the same 
     View rowView = convertView; 
     if (rowView == null) { 
      LayoutInflater inflater = context.getLayoutInflater(); 
      rowView = inflater.inflate(R.layout.main_listview, null, true); 
      holder = new ViewHolder(); 
      holder.textView = (TextView) rowView.findViewById(R.id.main_name); 
      holder.textView2 = (TextView) rowView.findViewById(R.id.main_info); 
      holder.imageView = (ImageView) rowView.findViewById(R.id.main_img); 
      rowView.setTag(holder); 
     } else { 
      holder = (ViewHolder) rowView.getTag(); 
     } 
     final Bitmap b = BitmapFactory.decodeFile("/sdcard/MediaCard2a44bb1f782925923195ee546e7ef395.jpg", null); 


     holder.textView.setText(); 
     holder.textView2.setText(""); 
     holder.imageView.setImageBitmap(b); 


     return rowView; 
    } 
} 

Et vous pouvez l'utiliser comme ceci sur votre activité:

ListView lv1 = (ListView)findViewById(R.id.listViewOne); 
String[] names = new String[] { "ONE", "TWO", "THREE"}; 
lv1.setAdapter(new MyArrayAdapter(this, names)); 

Espérons que ça aide!

1

Essayez code simple ::

ImageView image = (ImageView) findViewById(R.id.test_image); 
     FileInputStream in; 
     BufferedInputStream buf; 
     try { 
      in = new FileInputStream("/sdcard/test2.png"); 
      buf = new BufferedInputStream(in); 
      Bitmap bMap = BitmapFactory.decodeStream(buf); 
      image.setImageBitmap(bMap); 
      if (in != null) { 
      in.close(); 
      } 
      if (buf != null) { 
      buf.close(); 
      } 
     } catch (Exception e) { 
      Log.e("Error reading file", e.toString()); 
     } 
+0

throwin moi une exception 'java.lang.ArrayIndexOutOfBoundsException' –

1

La meilleure façon d'obtenir ce dont vous avez besoin, est de vous mettre en œuvre un adaptateur sur mesure et Adapter.getView() gonfler R.layout.main_listview

+0

Je n'ai pas compris ce que vous voulez dire .... –

+0

si vous implémentez votre adaptateur, vous pouvez utiliser getView: http://developer.android.com/ reference/android/widget/Adapter.html # getView% 28int,% 20android.view.View,% 20android.view.ViewGroup% 29, afin de gonfler la mise en page où vous placez votre ImageView et définissez tout ce dont vous avez besoin – Blackbelt