2012-03-27 5 views
1

Ich habe eine Frage zu einer Galerie/Bild-Tag-App für einen Kurs.Gridview Thumbnails verschwinden nach einer Weile

Meine Anwendung ist eine Galerie/Tag-Bild-App. Es beginnt mit der Anzeige einer Gitteransicht, die die Miniaturansichten aller auf der SD-Karte gespeicherten Bilder anzeigt. Das Problem im ist nach dieser Vorgehensweise erleben: Gridview ->Benutzer klickt auf ein Bild -> Vollansicht des Bildes ->Benutzer klickt zurück -> Rückkehr so zu gridview, nachdem sie den gridview zurückgekehrt, wenn Beim Scrollen werden die Miniaturansichten der Blöcke, die nicht in der direkten Ansicht sind, entfernt. Die Objekte sind jedoch immer noch vorhanden und anklickbar, aber das Miniaturbild ist nicht sichtbar.

Hoffnung etwas Hilfe mit diesem zu bekommen: D

public class App2Activity extends Activity { 
/** Called when the activity is first created. */ 
static Cursor cursor; 
static int columnIndex; 
static Bitmap bMap; 
static String imagePath; 
protected static ContentResolver cr; 
@Override 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    String[] projection = {MediaStore.Images.Thumbnails._ID}; //Columns to return 
    cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Images.Thumbnails.IMAGE_ID);//Puts selected columns in cursor object 
    columnIndex = cursor.getColumnIndex(MediaStore.Images.Thumbnails._ID);//return columns index 


    GridView imagesview = (GridView) findViewById(R.id.gridView1); 
    imagesview.setAdapter(new ImageAdapter(this)); 
    //Method litsens for thumbnail that is clicked and then loads the full image bit map 
    imagesview.setOnItemClickListener(new OnItemClickListener(){ 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 
      String[] projection = {MediaStore.Images.Media.DATA}; 
      //This segment fetches selected image path 
      cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null); 
      columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA); 
      cursor.moveToPosition(position); 
      imagePath = cursor.getString(columnIndex); 


      Intent intent = new Intent(v.getContext(), Fullview.class); 

      FileInputStream in; 
      BufferedInputStream buf; 

      try { 
       in = new FileInputStream(imagePath); 
       buf = new BufferedInputStream(in); 
       bMap = BitmapFactory.decodeStream(buf); 
       startActivity(intent);//Start fullviewclass to project bitmap in fullscreen 

       if (in != null) { 
        in.close(); 
       } 
       if (buf != null) { 
        buf.close(); 
       } 
      } catch (Exception e) { 
       Log.e("Error reading file", e.toString()); 
      } 

     } 
    }); 

} 
//Inflates menu when button is pressed 
public boolean onCreateOptionsMenu(Menu menu){ 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.exitmenu, menu); 

    return true; 
    } 
//handles the exit menu button 
public boolean onOptionsItemSelected(MenuItem item){ 

    switch(item.getItemId()){ 
     case R.id.exit: 
     finish(); 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

}

class ImageAdapter extends BaseAdapter{ 
private Context context; 

public ImageAdapter(Context cont){ 
    context = cont; 
} 
@Override 
public int getCount() { 

    return App2Activity.cursor.getCount(); 
} 

@Override 
public Object getItem(int position) { 
    return position; 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView iv; 
    // this segment sets up the gridview 
    if(convertView == null){ 
     iv = new ImageView(context); 

     iv.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     iv.setPadding(4, 4, 4, 4); 
     iv.setLayoutParams(new GridView.LayoutParams(120, 120)); 
    } 

    else { 
     iv = (ImageView)convertView; 
    } 
    //fetches thumbnails 
    App2Activity.cursor.moveToPosition(position); 
    int imageID = App2Activity.cursor.getInt(App2Activity.columnIndex); 
    iv.setImageURI(Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID)); 
    return iv; 
} 

}

public class Fullview extends Activity { 


public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fullview); 
    ImageView iv = (ImageView)findViewById(R.id.imageView1); 
    iv.setImageBitmap(App2Activity.bMap); 

} 
//Inflates menu when button is pressed 
public boolean onCreateOptionsMenu(Menu menu){ 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 

    return true; 
} 
//Handles menu options 
public boolean onOptionsItemSelected(MenuItem item){ 

    switch(item.getItemId()){ 
     case R.id.back: 
     finish(); 
     case R.id.Tag: 

      Intent intent = new Intent(getApplicationContext(), ContactsDisplay.class); 
      startActivityForResult(intent, 0); 
      return true; 

     case R.id.tagged: 
      Intent intent2 = new Intent(getApplicationContext(), TaggedViewer.class); 
      startActivity(intent2); 
      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

//Gets the result Uri from choosing a contact after having pressed menu option "Tag" and saves pic/contact combination to internal storage 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    if(resultCode == RESULT_OK){ 
     if(requestCode == 0){ 
      //This segment saves the tagged contact uri and hashes the associated imagepath name which become filename internal storage file 
      Uri result = data.getData(); 
      String toBeStored = result.toString(); 
      Log.w("GOT", result.toString()); 

      int filehash = App2Activity.imagePath.hashCode(); 
      String strfilehash = String.valueOf(filehash); 

      try { 
       FileOutputStream fos = openFileOutput(strfilehash, MODE_PRIVATE); 
       fos.write(toBeStored.getBytes()); 
       fos.close(); 
      } catch (FileNotFoundException e) { 
       Log.w("FileWrite", "FileError"); 
      } catch (IOException e) { 
       Log.w("FileWrite", "WriteError"); 
      } 
     } 
    } 

Before bug picture so das ist, was der Blick aussieht, bevor der Fehler auftritt . Alle Bilder sind da, und nach der Rückkehr von der Vollansicht und etwas Scrollen später, tritt der Fehler auf und die Ansicht sieht wie folgt aus. Hinweis: Es behält alle Bilder, die die ganze Zeit sichtbar waren, und auch die Objekte, deren Miniaturbild verschwunden ist, sind noch anklickbar. After bug picture

Logcat sagt dies, wenn wieder eines der Bilder zu holen versuchen, die der Ansicht zurückzukehren soll:

Inhalt kann nicht geöffnet werden: Inhalt: // media/extern/images/thumbnails/java.io.FileNotFoundException: Kein Eintrag für content: // media/external/images/thumbnails/0 und dann noch ein paar zusätzliche Sachen und schließlich: resolveUri failed auf bad bitmap uri: content: // media/external/images/thumbnails/0

Irgendwie findet die Bildadapterklasse keine Miniaturbilder für die Bilder, die zur aktuellen Ansicht zurückkehren sollen. Ich habe ein Bild gesetzt dieses gesamten logcat Eintrag enthalten, aber im derzeit nicht mehr als 2 Links posten erlaubt :)

Hoffnung, dass alle Informationen, die Sie brauchen, ist :) für jede Hilfe freuen, die ich bekommen kann!

Antwort

1

Ich habe das Problem auf eigene Faust gefunden. Das Problem lag darin, dass ich die gleichen Variablen verwendete, um Thumbnails zu erhalten und dann Vollansicht-Bilder zu bekommen. Als ich also zum Galerie-Bildschirm zurückkehrte, hatte die Thumbnail-Abfrage die falschen Tabellen bekommen. Im Wesentlichen versuchte es, Thumbnails von der Tabelle der ganzen Bilder zu holen.

Lession gelernt, ohne Grund globale Variablen die Wiederverwendung = schlecht: D

+0

Ratet mal, was ich machte einen ähnlichen Fehler ... und Ihr Beitrag hat mir geholfen. Wurde die Ansicht zweimal eingestellt, das zweite Mal mit einem nicht vorhandenen Bild ...: P – Ixx

0

Try this:

private String getPath(Uri uri) { 
String[] data = { MediaStore.Images.Media.DATA }; 
CursorLoader loader = new CursorLoader(context, uri, data, null, null, null); 
Cursor cursor = loader.loadInBackground(); 
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
cursor.moveToFirst(); 
return cursor.getString(column_index); 
}