das laden von Bildern von SD-Karte-Verzeichnis in GridView

Habe ich eine app, die ermöglicht dem Benutzer das erstellen einer Foto-album(Ordner) auf die Externe Speicherung. Jetzt bin ich beim abrufen der Bilder aus diesem Verzeichnis und zeigt Sie innerhalb eines GridView-Steuerelements. Ich bin mit einem AsyncTask zum Durchlaufen des Verzeichnisses von Dateien mit listFiles() und dann beim erstellen einer bitmap-sobald ich schnappe mir jedes Bild, recyceln Sie das Gerät, und verwenden Sie es dann erneut. Mein problem ist, dass nichts angezeigt in meinem GridView. Ich habe ein paar Log-Pausen und LogCat zeigt mir, dass die iteration nicht passieren-und die Bilder abgerufen werden. Dies führt mich zu glauben, dass ich irgendwo einen Fehler gemacht in meiner Adapter-Klasse, bindet die bitmaps in den Raster, möglicherweise in getView? Oder vielleicht bin ich falsch. Jede Hilfe, was mache ich falsch? Ich habe versucht, zu kommentieren Sie den code, so viel wie möglich und habe ich ausgelassen unnötige Stücke. Dank

public class AlbumGridView extends Activity implements OnItemClickListener {

private GridView sdcardImages;
private ImageAdapter imageAdapter;

private Display display;

private Bitmap bitmap;
private Bitmap b;

File[] imageList;
private static final String TAG = "AlbumGridView";
String path;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.album_view);

    //display = 
    //((Object) getSystemService(Context.WINDOW_SERVICE))).getDefaultDisplay();

    path = getIntent().getStringExtra("key");
    Toast.makeText(this, path, Toast.LENGTH_SHORT).show();
    setupViews();
    setProgressBarIndeterminateVisibility(true);
    loadImages();



}

protected void onDestroy() {
    super.onDestroy();
    final GridView grid = sdcardImages;
    final int count = grid.getCount();
    ImageView v = null;
    for (int i = 0; i < count; i++) {
        v = (ImageView) grid.getChildAt(i);
        ((BitmapDrawable) v.getDrawable()).setCallback(null);
    }
}

//Set up the GridView

private void setupViews() {
    sdcardImages = (GridView) findViewById(R.id.gvAlbumView);
    //sdcardImages.setNumColumns(display.getWidth()/95);
    sdcardImages.setClipToPadding(false);
    sdcardImages.setOnItemClickListener(AlbumGridView.this);
    imageAdapter = new ImageAdapter(getApplicationContext());
    //imageAdapter.setImageList(path);
    sdcardImages.setAdapter(imageAdapter);
}

private void addImage(LoadedImage... value) {
    for (LoadedImage image : value) {
        imageAdapter.addPhoto(image);
        imageAdapter.notifyDataSetChanged();
    }
}

//Save Bitmap images to a list and return that list
@Override
public Object onRetainNonConfigurationInstance() {
    final GridView grid = sdcardImages;
    final int count = grid.getChildCount();
    final LoadedImage[] list = new LoadedImage[count];

    for (int i = 0; i < count; i++) {
        final ImageView v = (ImageView) grid.getChildAt(i);
        list[i] = new LoadedImage(
                ((BitmapDrawable) v.getDrawable()).getBitmap());
    }

    return list;
}

private void loadImages() {
    //TODO Auto-generated method stub
    final Object data = getLastNonConfigurationInstance();
    if (data == null) {
        new LoadImagesFromSDCard().execute();
    } else {
        final LoadedImage[] photos = (LoadedImage[]) data;
        if (photos.length == 0) {
            new LoadImagesFromSDCard().execute();
        }
        for (LoadedImage photo : photos) {
            addImage(photo);
        }
    }
}

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    //TODO Auto-generated method stub

}

/-------------------------------------------------------------------------------------/

//Adapter for the GridView

public class ImageAdapter extends BaseAdapter {

    private Context mContext;
    private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>();

    private String path;
    private Bitmap bitmap;

    public ImageAdapter(Context context) {
        mContext = context;
    }

    public void addPhoto(LoadedImage photo) {
        photos.add(photo);
    }

    public int getCount() {
        return photos.size();
    }

    public Object getItem(int position) {
        return photos.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    /*
     * public File[] setImageList(String path) {
     * 
     * //this.path = path; //this.imageList = imageList; //File imagesDir =
     * new File(path); //imageList = imagesDir.listFiles();
     * 
     * File imagesDir = new File(path); imageList = imagesDir.listFiles();
     * for (File image : imageList) try { bitmap =
     * BitmapFactory.decodeStream(image.toURL().openStream()); //use bitmap
     * and recycle afterwards LoadedImage lm = new LoadedImage(bitmap);
     * this.addPhoto(lm); bitmap.recycle();
     * 
     * } catch (IOException e) { e.printStackTrace(); } return imageList;
     * 
     * }
     */

    public View getView(int position, View convertView, ViewGroup parent) {
        final ImageView imageView;
        if (convertView == null) {
            imageView = new ImageView(mContext);
        } else {
            imageView = (ImageView) convertView;
        }
        imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        imageView.setPadding(2, 2, 2, 2);
        //imageView.setImageBitmap(photos.get(position).getBitmap());
        try {
            imageView
                    .setImageBitmap(BitmapFactory
                            .decodeStream(imageList[position].toURL()
                                    .openStream()));
        } catch (MalformedURLException e) {
            //TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            //TODO Auto-generated catch block
            e.printStackTrace();
        }
        return imageView;
    }
}

/*-------------------------------------------------------------------------*/

//AsyncTask to get the images

class LoadImagesFromSDCard extends AsyncTask<Object, LoadedImage, Object> {

    @Override
    protected Object doInBackground(Object... arg0) {
        //Load images from SD card in Background
        //Display each image on the screen

        File imagesDir = new File(path);
        imageList = imagesDir.listFiles();

        for (File image : imageList)

            try {

                if (bitmap != null) {
                    bitmap.recycle();
                    bitmap = null;
                }
                bitmap = BitmapFactory.decodeStream(image.toURL()
                        .openStream());
                Log.e(TAG, "Grabbed Image " + image.getName());
                //use bitmap then recycle after

                LoadedImage lm = new LoadedImage(bitmap);
                //addImage(lm);
                //imageAdapter.addPhoto(lm);
                //imageAdapter.setImageList(path);
                //imageAdapter.addPhoto(lm);
                //imageAdapter.setImageList(path);
                //bitmap.recycle();
                //addImage(lm);
                //imageAdapter.addPhoto(lm);
                Log.e(TAG, "Added Image " + lm.toString());

                //imageAdapter.setImageList(path);
                addImage(lm);

                //bitmap.recycle();

                //bitmap.recycle();

            } catch (Exception e) {
                e.printStackTrace();
            }

        return null;
    }
  • Nevermind. Ich fand es heraus 🙂
  • Vielleicht sollten Sie aktualisieren Sie Ihre Frage mit der Lösung, falls andere das gleiche problem haben wie du und finde diesen Beitrag.
  • Was war das problem ?
  • update die Lösung
  • Aktualisiert die Lösung. Sorry, dass es so lange gedauert hat, Jungs
InformationsquelleAutor Jade Byfield | 2011-12-30
Schreibe einen Kommentar