Android教程 - setImageResource和Grid View

时间:2014-01-14 17:15:26

标签: android gridview android-gridview android-gridlayout

我按照本教程实现了一个网格视图:

http://developer.android.com/guide/topics/ui/layout/gridview.html

适配器引用了以下图片:

// references to our images
private Integer[] mThumbIds = {
        R.drawable.sample_2, R.drawable.sample_3,
        R.drawable.sample_4, R.drawable.sample_5,
        R.drawable.sample_6, R.drawable.sample_7,
        R.drawable.sample_0, R.drawable.sample_1,
        R.drawable.sample_2, R.drawable.sample_3,
        R.drawable.sample_4, R.drawable.sample_5,
        R.drawable.sample_6, R.drawable.sample_7,
        R.drawable.sample_0, R.drawable.sample_1,
        R.drawable.sample_2, R.drawable.sample_3,
        R.drawable.sample_4, R.drawable.sample_5,
        R.drawable.sample_6, R.drawable.sample_7
};

然后使用 setImageResource

显示图片
imageView.setImageResource(mThumbIds[position]);

我想改善这一点......:

  1. 从互联网下载图片(我将提供URI)
  2. 缓存图片
  3. 在GridView中显示它们
  4. 我该怎么做?请指出正确的方向,并尽可能提供相关的教程

2 个答案:

答案 0 :(得分:1)

  • 从互联网下载图片(我将提供URI)

本教程可以帮助您https://stackoverflow.com/questions/15549421/how-to-download-and-save-an-image-in-android

  • 缓存图片

如果您希望在一个应用程序生命周期中拥有缓存,或者创建SQLite数据库以获得可以永久存储数据的缓存,则可以在您的类中使用HashMap https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

  • 在GridView中显示它们

您需要扩展BaseAdapter类。本教程可以帮助您:http://www.stealthcopter.com/blog/2010/09/android-creating-a-custom-adapter-for-gridview-buttonadapter/

如果您有其他与此主题相关的问题,或者有些问题不明确,请问我,我会尽力帮助您

答案 1 :(得分:0)

AsyncTask在ImageView上加载图片:

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    private ImageView bmImage;

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

    protected Bitmap doInBackground(String... urls) {
        final File cacheDir = getCacheDir();
        Bitmap bitmap = null;
        if (Utill.isMemoryAvaliable(dir.getPath())){
            String url = urls[0];
            String filename = url.substring(url.lastIndexOf("/")+1,url.contains("?")?url.indexOf("?"):url.length());
            File f = new File(cacheDir, filename);
            //from SD cache
            if(!f.exists()){
                try {
                    Utill.DownloadFromUrl(url, filename, cacheDir);
                } catch (IOException ex) {
                    Log.e("Error", "Download", ex);
                }
            }
            if(f.exists())
                bitmap =  decodeFile(new File(cacheDir, filename));
        }
        return bitmap;
    }

    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }

    private Bitmap decodeFile(File f) {
        try {
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);
            return BitmapFactory.decodeStream(new FileInputStream(f));
        } catch (FileNotFoundException e) {
            Log.e("Error", "Decode File", e);
        }
        return null;
    }

}

下载图片:

public static boolean downloadFromUrl(String downloadUrl, String fileName, File dir) throws IOException {
        if (URLUtil.isValidUrl(downloadUrl)) {
            System.setProperty("http.keepAlive", "false");
            URL url = new URL(downloadUrl);
            HttpURLConnection ucon = (HttpURLConnection) url.openConnection();
            ucon.setRequestProperty("Connection", "Keep-Alive");
            ucon.setConnectTimeout(50000); 
            ucon.connect();
            if (ucon.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream is = url.openStream();
                if (is.available() > 0) {
                    BufferedInputStream bis = new BufferedInputStream(is);
                    ByteArrayBuffer baf = new ByteArrayBuffer(5000);
                    int current = 0;
                    while ((current = bis.read()) != -1) {
                        baf.append((byte) current);
                    }
                    File file = new File(dir, fileName);
                    FileOutputStream fos = new FileOutputStream(file);
                    fos.write(baf.toByteArray());
                    fos.flush();
                    fos.close();
                }
                is.close();
                return true;
            } else {
                return false;
            }
        }
        return false;
    }