Android studio Load Image url into listview

2019-05-21 03:29发布

I want to fill a listview with text and images. I receive this information by my mysql database, in JSON format. I have a field called "FOTO" and I store into this the path to the photo like: "http://....../1.png".

I get and android.os.NetworkOnMainThreadException using this code, but I don't know how to do different.

I parse the JSON and pass the values to the listadapter. I need to pass also the icon so the bitmap value, but I need to download it from the server.

public class DisplayListView extends AppCompatActivity {
    final static String TAG = "sb.dl";
    String json_string;
    JSONObject jsonObject;
    JSONArray jsonArray;
    TeamAdapter teamAdapter;
    ListView listView;
    Bitmap icon = null;

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

        teamAdapter = new TeamAdapter(this, R.layout.row_layout);
        listView = (ListView) findViewById(R.id.listview);
        listView.setAdapter(teamAdapter);

        json_string = getIntent().getExtras().getString("json_data");
        Log.d(TAG, "json_string " + json_string);

        try {
            jsonObject = new JSONObject(json_string);
            jsonArray = jsonObject.getJSONArray("risposta");
            int count = 0;

            String nome, num, data;

            while (count < jsonArray.length()) {
                JSONObject JO = jsonArray.getJSONObject(count);
                nome = JO.getString("NOME");
                num = JO.getString("NUMERO");
                data = JO.getString("DATA_NASCITA");
                String url = JO.getString("FOTO");

                icon = LoadImageFromWebOperations(url);

                Team team = new Team(nome, num, data, icon);
                teamAdapter.add(team);

                count++;
            }

        } catch (JSONException e) {
            e.printStackTrace();
            Log.d("Simone", e.toString());
            Log.d("Simone", e.getMessage());
        }
    }

    public static Bitmap LoadImageFromWebOperations() {
        try {
            URL url = new URL("url");
            Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            return bmp;
        } catch (Exception e) {
            Log.d(TAG, "bitmap error: " + e.toString());
            Log.d(TAG, "bitmap error: " + e.getMessage());
            return null;
        }
    }

}

2条回答
我命由我不由天
2楼-- · 2019-05-21 03:54

try using picasso to load in your image.

http://square.github.io/picasso/

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

this will load the image into your imageview asynchronously.

get the library using the gradle import

compile 'com.squareup.picasso:picasso:2.5.2'
查看更多
劫难
3楼-- · 2019-05-21 04:16

I had the same problem. I solved with an AsyncTask that download the bitmaps.

I used this code:

class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {

    private final WeakReference<ImageView> imageViewReference;

    public ImageDownloaderTask(ImageView imageView) {
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        return downloadBitmap(params[0]);
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageViewReference != null) {
            ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                if (bitmap != null) {
                    imageView.setImageBitmap(bitmap);
                } else {
                    Drawable placeholder = null;
                    imageView.setImageDrawable(placeholder);
                }
            }
        }
    }

    private Bitmap downloadBitmap(String url) {
        HttpURLConnection urlConnection = null;
        try {
            URL uri = new URL(url);
            urlConnection = (HttpURLConnection) uri.openConnection();

            final int responseCode = urlConnection.getResponseCode();
            if (responseCode != HttpURLConnection.HTTP_OK) {
                return null;
            }

            InputStream inputStream = urlConnection.getInputStream();
            if (inputStream != null) {
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                return bitmap;
            }
        } catch (Exception e) {
            urlConnection.disconnect();
            Log.w("ImageDownloader", "Errore durante il download da " + url);
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
        return null;
    }
}

you call it by:

new ImageDownloaderTask(holder.imageView).execute(urlPhoto);

Hope this help :)

查看更多
登录 后发表回答