2014-11-06 73 views
0

在我的代码中,我显示了从gridview中的sdcard中获取的图像。现在我希望图像按升序排列的最后修改日期排序。我尝试使用Collections。排序和比较。但它显示错误。 她是我的代码 荫本根据日期对图像进行排序并在gridview中显示

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()); 

    } 

检索从SD卡的图片,我试图collections.sort比较对列表进行排序基于日期

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); 

但IAM获得的Java错误。 lang.ClasscastEception字符串不能转换为文件。

+0

java.lang中。ClassCastException错误 – Viveka 2014-11-06 10:12:25

+0

请准备您的查询以使用MediaStore.Images.Media.query()检查获取排序的列表图像:http://stackoverflow.com/questions/13824233/how-to-list-images-on-sd-card-按照时间排序 – 2014-11-06 10:14:53

回答

0

你加入String路径列表:第一行

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

更改您的列表是ArrayList<File>和实际:当比较

imageList.add(i.getAbsolutePath()); 

然而,你对待这些作为文件加上你的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元数据的图像的日期和它的往往是不同的从该文件的日期开始,该文件指示在设备上创建/修改文件的时间。

+0

我将imageList.add(i.getAbsolutePath())更改为imageList.add(i) – Viveka 2014-11-06 10:28:28

0

实现比较器,如下面的代码比较文件。

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

所以我认为我必须将imageList的类型从ArrayList 更改为文件。 – Viveka 2014-11-06 10:18:30

+0

你已经有了Files []只需要传入,不需要在ArrayList中填充它然后排序。先排序,然后创建ArrayList与文件的绝对路径,如果你有这样的需要创建ArrayList – Kirtan 2014-11-06 10:20:23

+0

啊是的,现在它的工作。 – Viveka 2014-11-06 10:24:06

-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因为你初始化数组列表,持有仅String对象清单:

imageList = new ArrayList<String>(); 
+0

是的,现在我明白了。我创建了一个单独的文件列表,并给收集排序,现在它工作 – Viveka 2014-11-06 10:25:32

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()); 
} 
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; 
      } 
     } 
    }); 
相关问题