如何为每个ListItem Android保存唯一的图片

时间:2011-08-04 21:49:59

标签: java android android-listview

我的问题是这个(不要让段落吓唬你,我的问题很简单,我相信):

MainActivity(A)中,我有一个listView。当我点击listView中的某个项目时,我会转到第二个activity(B)。在activity B中,我有一个允许用户拍照的按钮。现在我将这张图片保存在文件名下。因为我希望每个listItem的图片都是唯一的,所以我将图片的文件名作为项目的位置。例如,如果我点击列表中的item#1,则相应图片的名称为"1"。这一切都很有效,除非我删除一个项目。然后,当我在同一位置添加另一个项目时,我的代码会加载该项目的现有图片。例如 - 如果我为'2'保存了一张名为item2,的图片,那很好。当我删除此条目并添加另一个项目(即新项目2)时,我的代码会检查“图片名称'2'是否存在?”。如果是,则将此条目的图片设置为该图片。显然这是一个不同的条目,我不希望这发生。可能,我可以删除图片和项目,但我不知道如何做到这一点。

我希望我能很好地解释我的逻辑。我使用该职位的唯一原因是因为这是我能找到的项目唯一的独特之处。顺便说一下(不确定这是否相关),我在Activity AActivity B之间的意图中将项目位置作为额外内容传递。

如何解决此问题或使用变通方法?谢谢!

编辑1:

Facepalm。通过查看评论,我意识到删除它(正如我之前所说)^^,就是这样做的方法。有人能告诉我怎么做吗?

这是我用来保存图片的代码:

private void setImage() {
    if (loadPicture(getIntent().getStringExtra("position"), bitmap) != null) {
        // Toast.makeText(this, "not null", Toast.LENGTH_SHORT).show();
        imageView.setImageBitmap(loadPicture(
                getIntent().getStringExtra("position"), bitmap));
    }
}

private void savePicture(String filename, Bitmap b, Context ctx) {
    try {
        // ObjectOutputStream bos;
        FileOutputStream out;// = new FileOutputStream(filename);
        out = ctx.openFileOutput(filename, Context.MODE_WORLD_READABLE);
        // bos = new ObjectOutputStream(out);
        b.compress(Bitmap.CompressFormat.JPEG, 40, out);
        if (b.compress(Bitmap.CompressFormat.JPEG, 40, out) == true)
            // Toast.makeText(this, "returned true",
            // Toast.LENGTH_LONG).show();

            // bos.flush();
            // bos.close();
            out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

干杯。

3 个答案:

答案 0 :(得分:0)

答案在于问题:删除项目时删除文件。 File.delete()是您可能正在搜索的方法。如果该项目不是列表中的最后一个文件,您还必须重命名其他文件。

另一种更简单的方法是使用简单的计数器命名文件,并在Map的帮助下将列表中的每个项目与文件名相关联。

答案 1 :(得分:0)

我不想踩JB Nizet的答案,但我会提出另一个建议。使用SimpleCursorAdapterSqliteDatabase可以避免管理任何类型的数字密钥。只需保存数据库中文件的路径以及用户的任何其他相关信息,设置ViewBinder即可开始比赛。绑定器是一种非常灵活的方式来呈现数据,甚至可以有条件地呈现View对象。

答案 2 :(得分:0)

我解决这个问题的方法是每次添加项目时递增计数器,然后将此计数器保存在内部存储器中。这样,它不是基于位置,并且在删除项目时不会搞砸。我希望这可以继续工作,因为我对我的应用程序进行了修改。感谢所有人的帮助。