SimpleAdapter a imageView (Android)

0

Witam,

Mam problem z przypisaniem obrazku z internetu do imageView. Po uruchomieniu programu nie wczytuje obrazka z sieci. Błąd, który wyskakuje to :

 E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: https:/i.ytimg.com/vi/heQ1ud0B9q4/default.jpg (No such file or directory)
W/ImageView: resolveUri failed on bad bitmap uri: https://i.ytimg.com/vi/heQ1ud0B9q4/default.jpg

Kod źródłowy :

MainActivity.java

 package com.example.maniek.youtubejson;

import android.app.ProgressDialog;
import android.media.Image;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.HttpAuthHandler;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static android.net.Uri.*;

public class MainActivity extends AppCompatActivity {

    private String TAG = MainActivity.class.getSimpleName();

    private ProgressDialog pDialog;
    private ListView lv;

    private String related_yt_url = "https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=2&relatedToVideoId=9y8sZ6bZtaA&type=video&key=tutaj_klucz_prywatny :)";

    ArrayList<HashMap<String, String>> contactList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contactList = new ArrayList<>();

        lv = (ListView) findViewById(R.id.list);

        new JSONTask().execute();
    }

    public class JSONTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            HttpHandler sh = new HttpHandler();

            String jsonStr = sh.makeServiceCall(related_yt_url);

            Log.e(TAG, "Response from url: " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    JSONArray contacts = jsonObj.getJSONArray("items");

                    for (int i = 0; i < contacts.length(); i++) {
                        JSONObject c = contacts.getJSONObject(i);
                        JSONObject snippetObject = c.getJSONObject("snippet");
                        JSONObject idObject = c.getJSONObject("id");
                        JSONObject thumbnailsObject = snippetObject.getJSONObject("thumbnails");
                        JSONObject thumbnailsDefaultObject = thumbnailsObject.getJSONObject("default");

                        String title = snippetObject.getString("title");
                        String videoId = idObject.getString("videoId");
                        String imageUrl = thumbnailsDefaultObject.getString("url");

                        HashMap<String, String> contact = new HashMap<>();
                        contact.put("name", title);
                        contact.put("email", videoId);
                        contact.put("imageView", imageUrl.toString());



                        contactList.add(contact);
                    }
                } catch (final JSONException e) {
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "Json parsing error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    });
                }
            } else {
                Log.e(TAG, "Couldn't get json from server.");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), "Couldn't get json from server. Check LogCat for possible errors !", Toast.LENGTH_LONG).show();
                    }
                });
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if(pDialog.isShowing())
                pDialog.dismiss();

            ListAdapter adapter = new SimpleAdapter(MainActivity.this, contactList, R.layout.list_item, new String[]{"name", "email", "mobile", "imageView"}, new int[]{R.id.name, R.id.email, R.id.mobile, R.id.imageView});

            lv.setAdapter(adapter);
        }
    }
}

list_item.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="@dimen/activity_horizontal_margin">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/name"
            android:layout_height="wrap_content"
            android:paddingBottom="2dip"
            android:paddingTop="6dip"
            android:textColor="@color/colorPrimaryDark"
            android:textSize="16sp"
            android:textStyle="bold"
            android:layout_width="fill_parent"
            android:layout_toEndOf="@+id/imageView" />

        <ImageView
            android:layout_width="120dp"
            android:layout_height="90dp"
            app:srcCompat="@mipmap/ic_launcher"
            android:id="@+id/imageView"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true" />
    </RelativeLayout>

    <TextView
        android:id="@+id/email"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="2dip"
        android:textColor="@color/colorAccent" />

    <TextView
        android:id="@+id/mobile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#5d5d5d"
        android:textStyle="bold" />
</LinearLayout>
0

W którym miejscu leci wyjątek?
Podaj cały stacktrace.
Może aplikacja kod się ścieżki do pliku a nie adresu URL?

0

ImageView nie obsługuje linków (http://domena.com/costam.jpg). Musisz ten obrazek ściągnąć i wtedy go wczytać ImageView. Polecam w tym celu użyć jakiejś biblioteki przykładowo Glide lub Picasso, która ogarnie ściągnie obrazka, jego przechowywanie i cachowanie.

0

Nie lepiej wrzucić do WebView i obrazek sam się wczyta z linku?

0

@Haskell , dzięki za pomoc, wczytuje obrazek, tylko teraz potrzebuję ścieżkę do obrazka, żeby połączyć to z SimpleAdapter. Gdy robię tak jak poniżej to podaje mi taką ścieżkę do pliku :

 E/MainActivity: URL : = com.bumptech.glide.DrawableTypeRequest@a8cca8d
 String url = Glide.with(this).load("https://i.ytimg.com/vi/heQ1ud0B9q4/default.jpg").toString();
1

Ale po co tak robisz? Jeżeli już masz url, to Glide używasz w ten sposób:

 Glide
    .with(myFragment)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.loading_spinner)
    .crossFade()
    .into(myImageView);

Zamiast "myFragment" daj context do miejsca w którym wyświetlasz obrazek (activity lub fragment), url to wiadomo, "R.drawable.loading_spinner" to namiary na animowany placeholder, który będzie się wyświetlać w czasie gdy obrazek będzie ścigany z Internetu, a "myImageView" to widok ImageView w którym wyświetlasz obrazek.

P.S. Powyższy kod oczywiście umieszczasz w metodzie getView() swojego adaptera.

0

Czyli w moim przypadku myFragment to będzie list_item.xml ??

0

Nie, to będzie context twojego Activity. W klasie adaptera możesz zrobić coś takiego:

 public class MyAdapter extends ArrayAdapter<MyModel>{
    Context mContext;

    public MyAdapter(Activity context, ArrayList<MyModel> model) {
        super(context, 0, model);
        mContext = context;
    }
}

a następnie używaj tego mContext w Glide.

P.S. Kod powyżej to przykład, u ciebie konstruktor adaptera wygląda nieco inaczej, więc nie próbuj tego kopiować!

0

Nie działa. Mógłbyś na podstawie kodu co jest w pierwszym poście pokazać jak to zrobić ??

0

Nie podałeś kodu adaptera, nie będę wróżył z fusów. Poza tym ogarnij się, podałem ci rozwiązanie, a w sieci jest milion tutoriali do Glide. Teraz pokazujesz swoje lenistwo.

0

@Haskell sorry ale dopiero zaczynam moją przygodę z java. Problem, który teraz mam to nie wiem czy w moim przypadku jest teraz MyModel.

Kod :

 package com.example.maniek.youtubejson;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.media.Image;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.HttpAuthHandler;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static android.net.Uri.*;

public class MainActivity extends AppCompatActivity {

    private String TAG = MainActivity.class.getSimpleName();

    private ProgressDialog pDialog;
    private ListView lv;

    private String related_yt_url = "https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=2&relatedToVideoId=9y8sZ6bZtaA&type=video&key=prywatny_klucz";

    ArrayList<HashMap<String, String>> contactList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contactList = new ArrayList<>();

        lv = (ListView) findViewById(R.id.list);

        new JSONTask().execute();
    }

    public class JSONTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            HttpHandler sh = new HttpHandler();

            String jsonStr = sh.makeServiceCall(related_yt_url);

            Log.e(TAG, "Response from url: " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    JSONArray contacts = jsonObj.getJSONArray("items");

                    for (int i = 0; i < contacts.length(); i++) {
                        JSONObject c = contacts.getJSONObject(i);
                        JSONObject snippetObject = c.getJSONObject("snippet");
                        JSONObject idObject = c.getJSONObject("id");
                        JSONObject thumbnailsObject = snippetObject.getJSONObject("thumbnails");
                        JSONObject thumbnailsDefaultObject = thumbnailsObject.getJSONObject("default");

                        String title = snippetObject.getString("title");
                        String videoId = idObject.getString("videoId");
                        String imageUrl = thumbnailsDefaultObject.getString("url");

                        HashMap<String, String> contact = new HashMap<>();
                        contact.put("name", title);
                        contact.put("email", videoId);
                        contact.put("imageView", imageUrl.toString());



                        contactList.add(contact);
                    }
                } catch (final JSONException e) {
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "Json parsing error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    });
                }
            } else {
                Log.e(TAG, "Couldn't get json from server.");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), "Couldn't get json from server. Check LogCat for possible errors !", Toast.LENGTH_LONG).show();
                    }
                });
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if(pDialog.isShowing())
                pDialog.dismiss();

            ListAdapter adapter = new SimpleAdapter(MainActivity.this, contactList, R.layout.list_item, new String[]{"name", "email", "mobile", "imageView"}, new int[]{R.id.name, R.id.email, R.id.mobile, R.id.imageView});

            lv.setAdapter(adapter);
        }
    }

    public class MyAdapter extends ArrayAdapter<MyModel> {
        Context mContext;

        public MyAdapter(Activity context, ArrayList<MyModel> model){
            super(context, 0, model);
            mContext = context;
        }
    }
}

1

Pisałem przecież, że mój kod to tylko przykład i żebyś go nie kopiował...

Znajdź sobie w Internecie tutorial dotyczący custom adapter i zrób swój własny adapter pod swoje potrzeby. Następnie w klasie adaptera użyj Glide.

0

Zrobiłem coś takiego ale dalej nie wyświetla obrazku

 package com.example.maniek.youtubejson;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.Image;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.HttpAuthHandler;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import com.bumptech.glide.BitmapTypeRequest;
import com.bumptech.glide.Glide;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static android.net.Uri.*;

public class MainActivity extends AppCompatActivity {

    private String TAG = MainActivity.class.getSimpleName();

    private ProgressDialog pDialog;
    private ListView lv;

    ArrayList<String> imageYtUrl = new ArrayList<String>();

    private String related_yt_url = "https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=2&relatedToVideoId=9y8sZ6bZtaA&type=video&key=jhjhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj";

    ArrayList<HashMap<String, String>> contactList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contactList = new ArrayList<>();

        lv = (ListView) findViewById(R.id.list);

        new JSONTask().execute();
    }

    public class JSONTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            HttpHandler sh = new HttpHandler();

            String jsonStr = sh.makeServiceCall(related_yt_url);

            Log.e(TAG, "Response from url: " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    JSONArray contacts = jsonObj.getJSONArray("items");

                    for (int i = 0; i < contacts.length(); i++) {
                        JSONObject c = contacts.getJSONObject(i);
                        JSONObject snippetObject = c.getJSONObject("snippet");
                        JSONObject idObject = c.getJSONObject("id");
                        JSONObject thumbnailsObject = snippetObject.getJSONObject("thumbnails");
                        JSONObject thumbnailsDefaultObject = thumbnailsObject.getJSONObject("default");

                        String title = snippetObject.getString("title");
                        String videoId = idObject.getString("videoId");
                        String imageUrl = thumbnailsDefaultObject.getString("url");

                        HashMap<String, String> contact = new HashMap<>();
                        contact.put("name", title);
                        contact.put("email", videoId);
                        //contact.put("imageView", imageUrl.toString());

                        String imageViewUrl = imageUrl.toString();
                        imageYtUrl.add(imageViewUrl);

                        //Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageViewUrl).getContent());

                        //contact.put("imageView", bitmap.getGenerationId().);

//                        Bitmap thumb = ThumbnailUtils.createVideoThumbnail(imageViewUrl, MediaStore.Images.Thumbnails.MINI_KIND);
//
//                        Uri thumbUrl = getImage

                        contactList.add(contact);
                    }
                } catch (final JSONException e) {
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "Json parsing error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    });
//                } catch (MalformedURLException e) {
//                    e.printStackTrace();
//                } catch (IOException e) {
//                    e.printStackTrace();
                }
            } else {
                Log.e(TAG, "Couldn't get json from server.");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), "Couldn't get json from server. Check LogCat for possible errors !", Toast.LENGTH_LONG).show();
                    }
                });
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if(pDialog.isShowing())
                pDialog.dismiss();

            //ListAdapter adapter = new SimpleAdapter(MainActivity.this, contactList, R.layout.list_item, new String[]{"name", "email", "mobile", "imageView"}, new int[]{R.id.name, R.id.email, R.id.mobile, R.id.imageView});

            //lv.setAdapter(adapter);

            setContentView(R.layout.list_item);


            String[] stockArr = new String[imageYtUrl.size()];
            stockArr = imageYtUrl.toArray(stockArr);

            lv.setAdapter(new ImageListAdapter(MainActivity.this, stockArr));
        }
    }

    public class ImageListAdapter extends ArrayAdapter {
        private Context context;
        private LayoutInflater inflater;

        private String[] imageUrls;

        public ImageListAdapter(Context context, String[] imageUrls) {
            super(context, R.layout.list_item, imageUrls);

            this.context = context;
            this.imageUrls = imageUrls;

            inflater = LayoutInflater.from(context);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(null == convertView) {
                convertView = inflater.inflate(R.layout.list_item, parent, false);
            }

            Glide
                    .with(context)
                    .load(imageUrls[position])
                    .into((ImageView) convertView);

            return convertView;
        }
    }
}

0

@Odświeżam

0
package com.fows.adapter;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.fows.R;
import com.fows.presenter.PrelegentListPresenter;
import com.fows.view.PrelegentListRowView;
import com.squareup.picasso.Picasso;

import butterknife.BindView;
import butterknife.ButterKnife;
import de.hdodenhof.circleimageview.CircleImageView;

public class PrelegentAdapter extends RecyclerView.Adapter<PrelegentAdapter.PrelegentViewHolder> {

    public static class PrelegentViewHolder extends RecyclerView.ViewHolder implements PrelegentListRowView {

        @BindView(R.id.prelegent_image_view)
        CircleImageView prelegentCircleImageView;

        @BindView(R.id.name_text_view)
        TextView nameTextView;

        @BindView(R.id.surname_text_view)
        TextView surnameTextView;

        @BindView(R.id.company_text_view)
        TextView companyTextView;

        PrelegentViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }

        @Override
        public void displayPhoto(String urlPhoto) {
            Picasso.with(prelegentCircleImageView.getContext())
                    .load(urlPhoto)
                    .resize(100, 100)
                    .into(prelegentCircleImageView);
        }

        @Override
        public void displayName(String name) {
            nameTextView.setText(name);
        }

        @Override
        public void displaySurname(String surname) {
            surnameTextView.setText(surname);
        }
    }

    private final PrelegentListPresenter presenter;

    public PrelegentAdapter(PrelegentListPresenter presenter) {
        this.presenter = presenter;
    }

    @Override
    public PrelegentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_prelegent, parent, false);
        PrelegentViewHolder holder = new PrelegentViewHolder(view);
        view.setOnClickListener(click -> presenter.itemClick(holder.getAdapterPosition()));
        return holder;
    }

    @Override
    public void onBindViewHolder(PrelegentViewHolder holder, int position) {
        presenter.configurePrelegentRow(holder, position);
    }

    @Override
    public int getItemCount() {
        return presenter.getPrelegentsCount();
    }
}

Weź zobacz jak wygląda po ludzku napisany Adapter i wywal tego ArrayAdaptera.

1 użytkowników online, w tym zalogowanych: 0, gości: 1