Учебник по Android — setImageResource и представление сетки

я реализовал представление сетки, следуя этому руководству:

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

Как мне это сделать? Пожалуйста, укажите мне правильное направление и предоставьте любые соответствующие учебные пособия, если это возможно.


person chuckfinley    schedule 14.01.2014    source источник
comment
Напишите свою собственную логику для получения данных по сети или используйте библиотеки, универсальный загрузчик изображений или залп.   -  person Anirudha Agashe    schedule 14.01.2014
comment
Я бы предпочел написать сборщик сам. Знаете ли вы какие-нибудь хорошие учебники по этому вопросу?   -  person chuckfinley    schedule 14.01.2014


Ответы (2)


  • Загрузите изображения из Интернета (я предоставлю URI)

Этот учебник должен помочь вам https://stackoverflow.com/questions/15549421/how-to-download-and-save-an-image-in-android

  • Кэшировать изображения

Вы можете использовать только HashMap в своем классе, если хотите иметь кеш для одного жизненного цикла приложения, или создать базу данных SQLite, чтобы иметь кеш, в котором вы можете хранить данные навсегда 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/

Если у вас возникнет другой вопрос, относящийся к этой теме или что-то непонятно, спрашивайте, я постараюсь вам помочь

person pstrag    schedule 14.01.2014

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;
    }
person GhostDerfel    schedule 14.01.2014