2014-11-06 72 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; 
      } 
     } 
    }); 
相關問題