2015-04-03 61 views
0

我想從url中獲取圖像,並通過我的listviewadapter類將其設置在listview中。我在最後得到NULLPOINTEREXCEPTIONopenConnection() in getBitmapFromUrl方法。 這裏是我的代碼:ListView中從url獲取圖像

ListViewAdapter.java

import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class ListViewAdapter extends BaseAdapter { 

    public String msgType[] = new String[8]; 
    public String msgData[] = new String[8]; 
    public String msgTimeStamp[] = new String[8]; 
    Bitmap[] myBitmap = new Bitmap[8]; 
    public Activity context; 
    int positionX; 
    URL urlX; 
    public LayoutInflater inflater; 

    public ListViewAdapter(Activity context, String[] type, String[] data, 
      String[] timestamp) { 
     super(); 

     this.context = context; 
     this.msgType = type; 
     this.msgData = data; 
     this.msgTimeStamp = timestamp; 

     this.inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return msgData.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public static class ViewHolder { 
     ImageView imgView; 
     TextView txtType; 
     TextView txtData; 
     TextView txtTimestamp; 
     Bitmap myBitmap; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.list_item, null); 

      holder.imgView = (ImageView) convertView.findViewById(R.id.image); 
      holder.txtType = (TextView) convertView.findViewById(R.id.type); 
      holder.txtData = (TextView) convertView.findViewById(R.id.data); 
      holder.txtTimestamp = (TextView) convertView 
        .findViewById(R.id.timestamp); 

      convertView.setTag(holder); 
     } else 
      holder = (ViewHolder) convertView.getTag(); 

     // holder.imgView.setImageBitmap(myBitmap[position]); 
     holder.txtType.setText(msgType[position]); 
     holder.txtTimestamp.setText(msgTimeStamp[position]); 
     if (msgType[position].equals("0")) 
      holder.txtData.setText(msgData[position]); 
     else { 
      holder.txtData.setText(""); 
      URL url = null; 
      try { 
       url = new URL(msgData[position]); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
urlX=url; 
     positionX=position; 
     try { 
     Thread t = new Thread(new Runnable() { 
      public void run(){   
       myBitmap[positionX] = getBitmapFromUrl(urlX); 
      } 
     }); 
     t.start(); 

      t.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
      holder.imgView.setImageBitmap(myBitmap[position]); 
     } 

     return convertView; 
    } 





    public Bitmap getBitmapFromUrl(URL url1) { 
     Bitmap Bitmap = null; 
     try { 
      HttpURLConnection connection = (HttpURLConnection) url1 
        .openConnection(); 
      connection.setDoInput(true); 

      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      Bitmap = BitmapFactory.decodeStream(input); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return Bitmap; 
    } 

} 

編輯:

Thread t = new Thread(new Runnable() { 
      public void run(){   
       myBitmap[positionX] = getBitmapFromUrl(urlX); 
      } 
     }); 
     t.start(); 
     try { 
      t.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

的logcat(編輯後):

04-03 12:01:26.860: E/AndroidRuntime(11944): FATAL EXCEPTION: Thread-1155 
04-03 12:01:26.860: E/AndroidRuntime(11944): java.lang.NullPointerException 
04-03 12:01:26.860: E/AndroidRuntime(11944): at com.appquest.flatcassign.ListViewAdapter.getBitmapFromUrl(ListViewAdapter.java:127) 
04-03 12:01:26.860: E/AndroidRuntime(11944): at com.appquest.flatcassign.ListViewAdapter$1.run(ListViewAdapter.java:107) 
04-03 12:01:26.860: E/AndroidRuntime(11944): at java.lang.Thread.run(Thread.java:856) 
+0

確保您具有INTERNET權限 – 2015-04-03 06:20:13

+0

您正嘗試在主線程上下載圖像。這是行不通的。任何下載都必須在單獨的線程上執行。 – 2015-04-03 06:21:36

+0

如果我在那裏啓動一個線程,getView方法將繼續並返回null圖像。我對嗎? – 2015-04-03 06:27:22

回答

1

我嗨更新基礎adpter類看吹與畢加索圖書館的工具,你只需要複製和替換代碼,當然他幫你。不要忘記添加jar文件。

import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class ListViewAdapter extends BaseAdapter { 

    public String msgType[] = new String[8]; 
    public String msgData[] = new String[8]; 
    public String msgTimeStamp[] = new String[8]; 
    public Activity context; 
    public LayoutInflater inflater; 

    public ListViewAdapter(Activity context, String[] type, String[] data, 
      String[] timestamp) { 
     super(); 

     this.context = context; 
     this.msgType = type; 
     this.msgData = data; 
     this.msgTimeStamp = timestamp; 

     this.inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return msgData.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public static class ViewHolder { 
     ImageView imgView; 
     TextView txtType; 
     TextView txtData; 
     TextView txtTimestamp; 
     Bitmap myBitmap; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.list_item, null); 

      holder.imgView = (ImageView) convertView.findViewById(R.id.image); 
      holder.txtType = (TextView) convertView.findViewById(R.id.type); 
      holder.txtData = (TextView) convertView.findViewById(R.id.data); 
      holder.txtTimestamp = (TextView) convertView 
        .findViewById(R.id.timestamp); 

      convertView.setTag(holder); 
     } else 
      holder = (ViewHolder) convertView.getTag(); 

     // holder.imgView.setImageBitmap(myBitmap[position]); 
     holder.txtType.setText(msgType[position]); 
     holder.txtTimestamp.setText(msgTimeStamp[position]); 
     if (msgType[position].equals("0")) 
      holder.txtData.setText(msgData[position]); 
     else { 
      holder.txtData.setText(""); 
      Picasso.with(context).load(msgData[position]).into(holder.imgView); 
     } 
     return convertView; 
    } 
} 

謝謝。

+0

偉大的人!它的作品完美無瑕:) – 2015-04-03 07:12:30