5

Ich habe versucht, ein Bild von URLs zu laden, aber es funktioniert nicht. Zwei verschiedene Fehler passieren. Wenn ich eine URL einfüge, die mit www beginnt, wird die App nicht geschlossen, aber das Bild wird nicht geladen, sondern nur ein weißer Bereich angezeigt. Wenn die URL jedoch mit http: // beginnt, wird die App geschlossen.Ein Bild kann nicht von URL geladen werden

Der Code, den ich um das Bild zu laden bin mit der nächste:

public class ThreadAdapter extends BaseAdapter { 
    ArrayList<Threadx> data; 
    LayoutInflater inflater; 
    public ThreadAdapter(Context context, ArrayList<Threadx> data) { 
     super(); 
     inflater = LayoutInflater.from(context); 
     this.data = data; 
    } 

    @Override 
    public int getCount() { 
     return data.size(); 
    } 

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

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 
    private static class ViewHolder { 
     TextView tvSubject; 
     TextView tvContent; 
     ImageView imagen; 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.list_row_thread, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.tvSubject = (TextView) convertView 
        .findViewById(R.id.tvSubject); 
      viewHolder.tvContent = (TextView) convertView 
        .findViewById(R.id.tvContent); 
      viewHolder.imagen = (ImageView) convertView 
        .findViewById(R.id.image); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     String subject = data.get(position).getSubject(); 
     String content = data.get(position).getContent(); 
     String imagen = data.get(position).getImagen(); 
     viewHolder.tvSubject.setText(subject); 
     viewHolder.tvContent.setText(content); 
     Bitmap bitmap = null; 
     HttpURLConnection urlConnection = null; 
     try { 
      URL url = new URL("www.matrallune.com/images/imagen_corporativa.jpg"); 
      //bitmap = BitmapFactory.decodeStream((InputStream)new URL("www.matrallune.com/images/imagen_corporativa.jpg").getContent()); 
      //bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      InputStream is = urlConnection.getInputStream(); 
      bitmap = BitmapFactory.decodeStream(is); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     viewHolder.imagen.setImageBitmap(bitmap); 
     return convertView; 
    } 
} 

ich verschiedene Methoden ausprobiert, wie Sie im Code sehen können, aber alle von ihnen die gleichen Probleme haben. Meine Absicht ist, die URL von der Variable "imagen" abzufangen.

+0

Sie vermissen urlConnection.connect(); –

+0

Hat Ihre App die richtigen Berechtigungen? Erhalten Sie eine Ausnahme? –

+1

Sie können auch die Bildladebibliothek 'Picasso' verwenden, die das Bild effizient laden kann und auch die Antwort zwischenspeichern kann. http://square.github.io/picasso/ – theapache64

Antwort

3

verwenden diese Frage >> Loading Bitmap to ImageView from URL in android

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
    private ImageView imageView; 
    private Bitmap image; 

    public DownloadImageTask(ImageView imageView) { 
     this.imageView = imageView; 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     try { 
      InputStream in = new java.net.URL(urldisplay).openStream(); 
      image = BitmapFactory.decodeStream(in); 
     } catch (Exception e) { 
      image = null; 
     } 
     return image; 
    } 

    @SuppressLint("NewApi") 
    protected void onPostExecute(Bitmap result) { 
     if (result != null) { 
      imageView.setImageBitmap(result); 
     } 
    } 
} 

Jetzt in Ihrem Code aufrufen:

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder viewHolder = null; 
    if (convertView == null) { 
     conv`enter code here`ertView = inflater.inflate(R.layout.list_row_thread, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.tvSubject = (TextView) convertView 
       .findViewById(R.id.tvSubject); 
     viewHolder.tvContent = (TextView) convertView 
       .findViewById(R.id.tvContent); 
     viewHolder.imagen = (ImageView) convertView 
       .findViewById(R.id.image); 
     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
    String subject = data.get(position).getSubject(); 
    String content = data.get(position).getContent(); 
    String imagen = data.get(position).getImagen(); 
    viewHolder.tvSubject.setText(subject); 
    viewHolder.tvContent.setText(content); 
    new DownloadImageTask(viewHolder.imagen).execute("www.matrallune.com/images/imagen_corporativa.jpg"); 
    return convertView; 
} 
+0

Wow, es funktioniert! Es ist wegen der AsyncTask? Danke für die Hilfe! –

+0

Ja. Sie können keine Verbindung mit dem Internet im UI-Thread herstellen. –

+0

Und Sie können die Benutzeroberfläche im Worker-Thread nicht aktualisieren. So asynt Aufgabe ist großartig, es zu tun. –

1

Ich vermute, dass Sie vermissen urlConnection.connect();
, um Ihren Code zu ändern:

try { 
      URL url = new URL("www.matrallune.com/images/imagen_corporativa.jpg"); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.connect(); 
      InputStream is = urlConnection.getInputStream(); 
      bitmap = BitmapFactory.decodeStream(is); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

Nicht obwohl sicher.

und wie in den Kommentaren empfohlen, ist es ratsam, Bibliothek wie Picasso zu verwenden. Es ist sehr leicht. nur integrieren und ändern Code:

Picasso.with(context).load(url).into(imgView); 

Update: versuchen, einschließlich connection.setDoInput(true); setUseCaches(false).

+0

funktioniert nicht, aber danke für die Hilfe;) –

+0

@ManelMendez ok, ich war nur raten, aber es kann auch andere Probleme geben. –

+0

@ManelMendez nur aktualisierte Antwort, versuchen Sie es. –

0

Mit Picaso Lib http://square.github.io/picasso/ Anruf Picasso.with(context).load("http://imageUrl/image.png").into(imageView);

+0

Es gibt einen Fehler im Kontext, ich kann es nicht lösen. –

+0

Bis spät @ManelMendez aber es musste mContext sein – Greg

+0

Versuchen wir ClassName.this –

1

Lade Bild durch Picasso ist wie sage 123, Du bist fertig

Picasso 
.with(context) //Context 
.load("http://i.imgur.com/DvpvklR.png") //Can be Url,File.. 
.into(imageView)//The ImageView; 

Dies ist nur die normale Belastung, haben Sie mehr Möglichkeiten in ihrem Documentation

nach Ihrem Code

Picasso 
    .with(context) //Context 
    .load("http://matrallune.com/images/imagen_corporativa.jpg") //Can be Url,File.. 
    .into(viewHolder.imagen)//The ImageView; 

Sie nur den imageloading Codes mit dem obigen Code finden können, ersetzen wollte .

Ihr Abschluss Adapter

public class ThreadAdapter extends BaseAdapter { 
    ArrayList<Threadx> data; 
    LayoutInflater inflater; 
    private Context mContext; 

    public ThreadAdapter(Context mContext, ArrayList<Threadx> data) { 
     super(); 
     inflater = LayoutInflater.from(context); 
     this.data = data; 
     this.mContext = mContext; 
    } 

    @Override 
    public int getCount() { 
     return data.size(); 
    } 

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

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

    private static class ViewHolder { 
     TextView tvSubject; 
     TextView tvContent; 
     ImageView imagen; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.list_row_thread, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.tvSubject = (TextView) convertView 
        .findViewById(R.id.tvSubject); 
      viewHolder.tvContent = (TextView) convertView 
        .findViewById(R.id.tvContent); 
      viewHolder.imagen = (ImageView) convertView 
        .findViewById(R.id.image); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     String subject = data.get(position).getSubject(); 
     String content = data.get(position).getContent(); 
     String imagen = data.get(position).getImagen(); 
     viewHolder.tvSubject.setText(subject); 
     viewHolder.tvContent.setText(content); 

     //Loading image 
     Picasso 
     .with(mContext) //Context 
     .load("http://matrallune.com/images/imagen_corporativa.jpg") //Can be Url,File.. 
     .into(viewHolder.imagen)//The ImageView; 


     return convertView; 
    } 
} 

Wenn Sie den Adapter aus einem Fragmente initialisiert wird, sollten Sie den Kontext als getActivity() übergeben oder man könnte es auch im onAttach() des Fragments initialisieren.

Wenn Sie den Adapter von einer Aktivität initialisieren. Sie wollten nur this übergeben.

initialisieren

von Aktivität

ThreadAdapter tAdapter = new ThreadAdapter(this,data); 

von Bruchstück

ThreadAdapter tAdapter = new ThreadAdapter(getActivity(),data); 
+0

Es ist ein Fehler im Zusammenhang, ich kann es nicht lösen. –

+0

@ManelMendez aktualisierte Antwort mit Ihrem endgültigen Adapter. und das enthält A-Z. Frag mich, ob du mehr Klarheit brauchst. – theapache64

+0

die App beendet, wenn ich den Code versuchen (wenn ich das Attribut Kontext zu setzen Aber danke für die Hilfe –