根据日期对图像进行排序并在gridview中显示

时间:2014-11-06 10:09:43

标签: android gridview

在我的代码中,我在gridview中显示了从sdcard中获取的图像。现在我希望按照上一个修改日期按升序对图像进行排序。我尝试使用Collections.sort和comparator.But它显示错误。 她是我的代码 我通过这个

从sdcard中检索图像
 ArrayList<String> f = new ArrayList<String>();
    File[] listFile;

    String ExternalStorageDirectoryPath = Environment
            .getExternalStorageDirectory().getAbsolutePath();

    String targetPath = ExternalStorageDirectoryPath + "/saved_images";


    File targetDirector = new File(targetPath);
    imageList = new ArrayList<String>();
    File[] files = targetDirector.listFiles();
    for (File i : files) {
        imageList.add(i.getAbsolutePath());

     }

我尝试使用collections.sort Comparator根据日期对列表进行排序

Collections.sort(imageList,new Comparator<Object>()
            {
        public int compare(Object o1, Object o2) {

            if (((File)o1).lastModified() > ((File)o2).lastModified()) {
                return -1;
            } else if (((File)o1).lastModified() < ((File)o2).lastModified()) {
                return +1;
            } else {
                return 0;
            }
        }

            });

    lazyloadadapter = new LazyLoadAdapter(getActivity(), imageList);
    gV.setAdapter(lazyloadadapter);

但是我收到java.lang.ClasscastEception错误的字符串无法转换为文件。

5 个答案:

答案 0 :(得分:0)

您要将String路径添加到列表中:

imageList.add(i.getAbsolutePath());

然而,在比较时,您将这些视为文件:

public int compare(Object o1, Object o2) {
    if (((File)o1).lastModified() > ((File)o2).lastModified()) {

将您的列表更改为ArrayList<File>,并将第一行更改为实际添加File个对象 - 您应该没问题:

imageList.add(i);

当然,您可能需要修改代码的其他部分。另外,请指定比较器的类 - 将比较器代码更改为:

new Comparator<File>()
    public int compare(File o1, File o2) {
        if (o1.lastModified() > o2.lastModified()) {

如果您需要存储路径,那么在比较器中您需要实际创建File个对象 - 在这种情况下将比较器更改为:

new Comparator<String>()
    public int compare(String o1, String o2) {
        if (new File(o1).lastModified() > new File(o2).lastModified()) {

另一方面,按照上次修改日期对文件进行排序与​​按日期排序图像不同,因为图像通常会存储在EXIF元数据中拍摄图像的日期,并且它通常与文件的日期,表示在设备上创建/修改文件的时间。

答案 1 :(得分:0)

使用以下代码实现比较,以便比较文件。

Arrays.sort(files, new Comparator<File>(){
public int compare(File f1, File f2)
{
    return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
} });

答案 2 :(得分:0)

请尝试这种方式,希望这有助于您解决问题。

在使用循环

之前对文件数组进行排序
File[] files = targetDirector.listFiles();

Arrays.sort(files, new Comparator<Object>()
{
    public int compare(Object o1, Object o2) {

        if (((File)o1).lastModified() > ((File)o2).lastModified()) {
            return -1;
        } else if (((File)o1).lastModified() < ((File)o2).lastModified()) {
            return +1;
        } else {
            return 0;
        }
    }

});

imageList = new ArrayList<String>();
for (File i : files) {
   imageList.add(i.getAbsolutePath());
}

答案 3 :(得分:0)

Collections.sort(list, new Comparator<String>() {
        @Override
        public int compare(String lhs, String rhs) {
            File f1 = new File(lhs);
            File f2 = new File(rhs);

            if (f1.lastModified() > (f2.lastModified())) {
                return -1;
            } else if (f1.lastModified() < (f2.lastModified())) {
                return +1;
            } else {
                return 0;
            }
        }
    });

答案 4 :(得分:-1)

Modyfy

 Collections.sort(imageList,new Comparator<Object>() {
            public int compare(Object o1, Object o2) {
                File f1 = new File((String) o1);
                File f2 = new File((String) o2);
                if (f1.lastModified() > (f2.lastModified()) {
                    return -1;
                } else if (f1.lastModified() < (f2.lastModified()) {
                    return +1;
                } else {
                    return 0;
                }
            }
});

说明

  

您收到java.lang.ClassCastException,因为您将数组列表实例化为仅包含字符串对象的列表:

imageList = new ArrayList<String>();