Android教程-setImageResource和网格视图

Android教程-setImageResource和网格视图,android,gridview,android-gridview,android-gridlayout,Android,Gridview,Android Gridview,Android Gridlayout,我通过以下教程实现了网格视图: 适配器引用了以下图片: // 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.d

我通过以下教程实现了网格视图:

适配器引用了以下图片:

// 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]);
我想改进这一点,并且…:

  • 从internet下载图片(我将提供URI)
  • 缓存图像
  • 在GridView中显示它们

  • 我该怎么做?请为我指出正确的方向,并提供相关的教程(如果可能)

    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;
        }
    
    }
    
    • 从internet下载图片(我将提供URI)
    本教程应该对您有所帮助

    • 缓存图像
    如果您想在一个应用程序生命周期中拥有缓存,或者创建SQLite数据库来拥有缓存,您可以在类中使用HashMap来永久存储数据

    • 在GridView中显示它们
    您需要扩展BaseAdapter类。本教程将帮助您:


    如果您有其他与此主题相关的问题或不清楚的问题,请提问,我将尝试帮助您编写自己的逻辑,通过网络获取数据或使用库universal image loader或Volley。我更愿意自己编写获取程序。你知道这方面有什么好的教程吗?
    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;
        }