2011-03-29 107 views
1

我必須創建一個加載了來自駐留在SDCard上的特定文件夾中圖像的gridview。該文件夾的路徑是「/ sdcard/images /」。我試着用這個代碼,應用程序 需要太多時間來加載,它只顯示一個圖像。如何從SD卡中的文件夾動態顯示圖像

public class ImAdapterh extends BaseAdapter{ 

     File dir=new File(Environment.getExternalStorageDirectory(),"/myImages/"); 

int count=dir.list().length; 

String[] fileNames = dir.list(); 

private Context mContext; 

    public ImAdapterh(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
     return count; 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView = null;   


     for(String bitmapFileName : fileNames) 
     { 
      if (convertView == null) 
      { // if it's not recycled, initialize some attributes 
       imageView = new ImageView(mContext); 
       imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
       imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
       imageView.setPadding(8, 8, 8, 8);     

       Bitmap bmp = BitmapFactory.decodeFile(dir.getPath() + "/" + bitmapFileName); 
       System.out.println(dir); 
       imageView.setImageBitmap(bmp); 
      }else 
      { 
      imageView = (ImageView) convertView;    

      } 
    } 
     return imageView; 
     } 

應用程序被佔用太多的時間,它是隻顯示一個圖像

,這是我的活動類

 public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);   
     GridView gridview = (GridView) findViewById(R.id.gridview); 
     gridview.setAdapter(new ImAdapterh(this));} 

回答

1

該文件夾的路徑是「/ SD卡/圖片/」。

不,它不是,至少不適用於大多數設備。切勿在Android中硬編碼路徑。始終使用Environment.getExternalStorageDirectory()獲取外部存儲的根目錄。

我試過這段代碼,該應用程序需要花費太多時間來加載,它只顯示一個圖像。

當然。你在這裏做的事情沒有什麼正確的。

最大的問題是,你的getView()負載圖像到同一ImageView,對於每一個行你Adapter返回。推測,你應該只加載一個圖像到ImageView對於給定的行。

你的下一個最大的問題是你在主應用程序線程上做磁盤I/O。

+0

@Kishore:我沒有「樣本代碼」用於加載一個目錄滿圖像,爲'AdapterView'。然而,這裏是我的一本書的免費摘錄,其中介紹瞭如何將圖像放入'ListView'行,這可能有所幫助:http://commonsware.com/Android/excerpt.pdf – CommonsWare 2011-03-31 12:07:35

+0

Ware有沒有其他方法調用「getExternalStorageDirectory ()「,在應用程序中支持Api 1.5+ – Kishore 2011-05-25 09:38:29

+0

@Kishore:'getExternalStorageDirectory()'自從Android 1.0(API Level 1)以來就已經存在。 – CommonsWare 2011-05-25 10:38:17

0

從任何特定目錄中獲取圖像。使用下面的代碼

public void searchImageFromSpecificDirectory() { 

     String path = null; 

     String uri = MediaStore.Images.Media.DATA; 
     // if GetImageFromThisDirectory is the name of the directory from which image will be retrieved 
     String condition = uri + " like '%/GetImageFromThisDirectory/%'"; 
     String[] projection = { uri, MediaStore.Images.Media.DATE_ADDED, 
       MediaStore.Images.Media.SIZE }; 
     Vector additionalFiles = null; 
     try { 
      if (additionalFiles == null) { 
       additionalFiles = new Vector<String>(); 
      } 



      Cursor cursor = managedQuery(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, 
        condition, null, null); 
      if (cursor != null) { 

       boolean isDataPresent = cursor.moveToFirst(); 

       if (isDataPresent) { 

        do { 

         path = cursor.getString(cursor.getColumnIndex(uri)); 
System.out.println("...path..."+path); 
additionalFiles.add(path); 
      }while(cursor.moveToNext()); 
       } 
      if (cursor != null) { 
       cursor.close(); 
      } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
相關問題