在我的代码中,我在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错误的字符串无法转换为文件。
答案 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>();