Android studio 将图像 url 加载到列表视图中

Android studio Load Image url into listview

我想用文本和图像填充列表视图。 我的 mysql 数据库以 JSON 格式接收此信息。 我有一个名为 "FOTO" 的字段,我在其中存储了照片的路径,例如:“http://....../1.png”。

我得到并 android.os.NetworkOnMainThreadException 使用此代码,但我不知道如何做不同的事情。

我解析 JSON 并将值传递给列表适配器。我还需要传递图标以便位图值,但我需要从服务器下载它。

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;
        }
    }

}

尝试使用 picasso 加载您的图像。

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

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

这会将图像异步加载到您的图像视图中。

使用 gradle 导入获取库

compile 'com.squareup.picasso:picasso:2.5.2'

我遇到了同样的问题。 我用下载位图的 AsyncTask 解决了问题。

我使用了这个代码:

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;
    }
}

您通过以下方式称呼它:

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

希望对您有所帮助:)