【问题标题】:How do I persist images on Gridview? Please someone如何在 Gridview 上保留图像?请某人
【发布时间】:2014-05-13 18:33:57
【问题描述】:

我有下面的代码,它将从图库中挑选出的图像列表放入 GridView 布局。 图片在 GridView 布局中显示得很好,但问题是当我关闭应用程序或从图库中选择不同图片时这些图片会消失。

有人能指点我正确的方向吗?

任何帮助将不胜感激。

代码:

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;

  }
 }       
}

编辑:发布上面的工作代码

【问题讨论】:

    标签: android android-intent android-gridview android-gallery android-external-storage


    【解决方案1】:

    把这些放在你的 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;
    
       }
      }       
     }
    

    【讨论】:

    • 我刚试了一下,效果很好!我会将其标记为正确答案,非常感谢。
    【解决方案2】:

    我建议您使用SQlite database 来存储图像路径。
    拍照时,将它们保存在SD卡中,并在数据库中记录它们的路径。
    每次您开始 Activity 时都会迭代您的数据库,获取所有内容并填充您的 GridView。
    SharedPreferences 如果您不打算保存大量图像,这很好。

    【讨论】:

    • 感谢 cmets,但我的目标是让用户从图库中挑选图像,然后将这些图像显示到 gridview 中。正如我上面所说,当应用程序关闭或用户选择不同的图像时,这些图像不会留在网格视图上。我似乎无法找到将图像列表(数组)保存到某处的方法。我从这些图像中打印出数据的 logcat,但我不确定它们是什么,可能是路径?
    • 因此您需要数据库。如果用户拾取图像,则将该图像路径保存到数据库。这样,当您退出应用程序时,路径仍存储在数据库中,当您想重新开始时,从数据库中获取路径并在 gridview 中显示图像。
    • 你能给我一些示例代码吗?我以前没有使用过 SQLite 数据库,也不知道如何启动它。很抱歉这个菜鸟问题,非常感谢你
    • 这里有一个简单的教程hmkcode.com/android-simple-sqlite-database-tutorial。只需将标题或作者列更改为文件路径即可。
    • 感谢您的链接,但对我来说,我无法理解如何将代码应用于我的问题。 Андрей Москвичёв 的例子似乎为我指明了正确的方向。
    【解决方案3】:

    如果您需要在应用关闭时保留列表,则需要将列表存储到 SharedPreferences,数据库或文件。

    方法一:使用 SharedPreferences。

    将选定的文件保存到 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();
    

    从 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
    }
    

    方法二:使用 SQLLiteDatabase。

    定义派生自 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();
            }
        }
    }
    

    在activity的onCreate中创建这个类的对象。 调用 readImageFiles() 读取图像文件路径。 调用 addImageFile(String file) 将图像文件路径添加到数据库中。

    在 ImageLoader imageLoader 行之后添加以下行:

    ImagesOpenHelper imagesOpenHelper;
    

    添加到 onCreate

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

    在 onActivityResult 中将以下行添加到 for 循环中:

    imagesOpenHelper.addImageFile(string);
    

    【讨论】:

    • 首选项不适用于这种行为,正确的方法是使用数据库。仅仅因为你可以并不意味着你应该。
    • 我写的数据库也可以用。但是,如果数据是包含几个元素的简单列表,最好使用 SharedPreferences 而不是数据库。当元素多且元素复杂时,数据库会更好。
    • 感谢您的评论,但图像列表会很长,我在考虑大约 100 多个图像,具体取决于用户。 SQ lite 数据库上的任何示例将不胜感激。老实说,我不知道如何开始使用 SQLite 数据库。谢谢
    • 添加方法二:使用 SQLLiteDatabase。
    • 非常感谢 SQLite 示例,请您详细说明调用 readImageFiles() 和调用 addImageFile(String file) 吗?对不起,我不知道怎么做。我刚开始学习编程 1-2 个月前。我知道如何使用 putExtra() 和 getExtra() 或使用意图传递数据.. 但不知道如何在另一个类中调用对象:-( 非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    相关资源
    最近更新 更多