سؤال

I have the code below which take a list of images which are picked out from Gallery into the GridView layout. The pictures are shown up in the GridView layout just fine, but the problem is that these pictures disappear when I close the app or when I pick different pictures from the Gallery.

Would someone please point me to the right direction?

Any help would be greatly appreciated.

Code:

public class MainActivity extends Activity {

   GridView gridGallery;
   Handler handler;
   Gallery_Adapter_Activity adapter;

   Button btnGalleryPick;
   Button btnGalleryPickMul;

   String action;
   ViewSwitcher viewSwitcher;
   ImageLoader imageLoader;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    initImageLoader();
    init();
}

private void initImageLoader() {
    @SuppressWarnings("deprecation")
    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheOnDisc().imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
            .bitmapConfig(Bitmap.Config.RGB_565).build();
    ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(
            this).defaultDisplayImageOptions(defaultOptions).memoryCache(
            new WeakMemoryCache());

    ImageLoaderConfiguration config = builder.build();
    imageLoader = ImageLoader.getInstance();
    imageLoader.init(config);
}

private void init() {

    handler = new Handler();
    gridGallery = (GridView) findViewById(R.id.gridGallery);
    gridGallery.setFastScrollEnabled(true);                     
    adapter = new Gallery_Adapter_Activity(getApplicationContext(), imageLoader);
    adapter.setMultiplePick(false);
    gridGallery.setAdapter(adapter);

    viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    viewSwitcher.setDisplayedChild(1);


    Button done_button = (Button) findViewById(R.id.done);      
    done_button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {       
            finish();                           
        }                       
    });


    btnGalleryPickMul = (Button) findViewById(R.id.btnGalleryPickMul);
    btnGalleryPickMul.setOnClickListener(new View.OnClickListener() {                               

        @Override
        public void onClick(View v) {       //Add Images Button OnClickListener
            Intent i = new Intent(Multiple_Pick_Activity.ACTION_MULTIPLE_PICK);
            startActivityForResult(i, 12345);           
        }                           
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == result_requestcode && resultCode == Activity.RESULT_OK)

{       

SDcardPath_Activity SDcardPath_Class = new SDcardPath_Activity();

String[] ALL_Paths = data.getStringArrayExtra("all_path");

for (String single_path : ALL_Paths) 
{      

    SQ_LITE_DATABASE.addImageFile(single_path);           

}

try { 


ArrayList<SDcardPath_Activity> SQLite_Databse_Data = SQ_LITE_DATABASE.readImageFiles();
SQLite_Databse_Data.add(SDcardPath_Class);

viewSwitcher.setDisplayedChild(0);
adapter.addAll(SQLite_Databse_Data);        

Intent intent = new Intent (Image_MainActivity.this, Image_MainActivity.class);
startActivity(intent);
finish();

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

  }
 }       
}

Edit: posted the working code above

هل كانت مفيدة؟

المحلول

Put these in your onActivityResult:

  @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == result_requestcode && resultCode == Activity.RESULT_OK)

    {       

    SDcardPath_Activity SDcardPath_Class = new SDcardPath_Activity();

    String[] ALL_Paths = data.getStringArrayExtra("all_path");

    for (String single_path : ALL_Paths) 
    {      

        SQ_LITE_DATABASE.addImageFile(single_path);           

    }

 try { 


    ArrayList<SDcardPath_Activity> SQLite_Databse_Data = SQ_LITE_DATABASE.readImageFiles();
    SQLite_Databse_Data.add(SDcardPath_Class);

    viewSwitcher.setDisplayedChild(0);
    adapter.addAll(SQLite_Databse_Data);        

    Intent intent = new Intent (Image_MainActivity.this, Image_MainActivity.class);
    startActivity(intent);
    finish();

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

   }
  }       
 }

نصائح أخرى

I suggest that you use a SQlite database where you can store the images paths.
When taking pictures , save them in the SD card and record their paths in the database.
Everytime you start your activity iterate your database, get all the contents and populate your GridView.
SharedPreferences is good if you don't intend to save lots of images.

If you need a list to remain when app closed, you need to store the list to SharedPreferences, to database or to file.

Method I: using SharedPreferences.

Save selected files to SharedPreferences

 // selectedFiles is Set<String> with all your selected files
 Set<String> selectedFiles = new HashSet<String>();

 // TODO put your selected file names into selectedFiles set

 SharedPreferences prefs = getSharedPreferences("prefs_selection", 0);
 SharedPreferences.Editor editor = prefs.edit();

 editor.putStringSet("selection", selectedFiles);

 // save
 editor.commit();

Restore selected files from SharedPreferences

SharedPreferences prefs = getSharedPreferences("prefs_selection", 0);

Set<String> selectedFiles = prefs.getStringSet("selection", null);
if (selectedFiles != null) {
    // TODO put elements of selectedFiles into appropriate your elements
}

Method II: using SQLLiteDatabase.

Define class derived from SQLiteOpenHelper.

public class ImagesOpenHelper extends SQLiteOpenHelper {

    private static final String KEY_IMAGE = "image_file";
    private static final String DATABASE_NAME = "imagesdb";
    private static final int DATABASE_VERSION = 1;
    private static final String IMAGES_TABLE_NAME = "images";
    private static final String IMAGES_TABLE_CREATE =
            "CREATE TABLE " + IMAGES_TABLE_NAME + " (" +
            KEY_IMAGE + " TEXT);";

    public ImagesOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(IMAGES_TABLE_CREATE);
    }

    public void addImageFile(String file) {
        ContentValues values = new ContentValues();
        values.put(KEY_IMAGE, file);

        getWritableDatabase().insert(IMAGES_TABLE_NAME, null, values);
    }

    public void readImageFiles() {
        Cursor cursor = getReadableDatabase().query(IMAGES_TABLE_NAME, new String[] { KEY_IMAGE }, null, null, null, null, null, null);

        try {
            if (!cursor.moveToFirst())
                return ; 

            ArrayList<SDcardPath_Activity> Picture_List = new ArrayList<SDcardPath_Activity>();

            do {
                String file = cursor.getString(0);

                SDcardPath_Activity PICTURE = new SDcardPath_Activity();
                PICTURE.sdcardPath = file;
                Picture_List.add(PICTURE);

            } while (cursor.moveToNext());

            viewSwitcher.setDisplayedChild(0);
            adapter.addAll(Picture_List);
        }
        finally {
            cursor.close();
        }
    }
}

Create object of this class in activity's onCreate. Call readImageFiles() to read image file paths. Call addImageFile(String file) to add image file path into your database.

Add after ImageLoader imageLoader line, the following line:

ImagesOpenHelper imagesOpenHelper;

Add to onCreate

imagesOpenHelper = new ImagesOpenHelper(this);
imagesOpenHelper.readImageFiles();

In onActivityResult add the following line to the for cycle:

imagesOpenHelper.addImageFile(string);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top