IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

GridAdapter dans Thread et context..


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut GridAdapter dans Thread et context..
    Bonjour à tous,

    voici ce que réalise mon code:

    1- Il extrait le contenu d'un fichier txt vers une arrylist, qui est une suite de chemin de fichiers(listeFichiers)
    2- Cette liste de de fichiers est ensuite utilisée pour remplir une autre arraylist(gridArray) laquelle va se décomposer en item,string.
    * item est un id d'image(icone) du drawable ou une thumbnail selon le type d'extension du fichier(id thumbnail fournit par deux méthodes, getVideoIdFromFilePath() et getImageIdFromFilePath())
    * String le nom du fichier
    3- En ressort un Gridview avec icones ou thumbnail et non de fichier dans chaque cellule.

    MainActivity:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    package com.example.gridviewproject;
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
     
     
     
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.app.Activity;
    import android.content.ContentResolver;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.util.Log;
     
    import android.widget.GridView;
     
    public class MainActivity extends Activity {
    String racine;
    String fichier;
    String line;
    private String TAG = "test";
    int i =0;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		final ArrayList<String> listeFichiers = new ArrayList<String>();
    		File mCurrentFile = Environment.getExternalStorageDirectory();
    		racine = mCurrentFile.getPath();
    		fichier = (racine + "/fichier.txt");
     
     
    		FileReader fr = null;
    		try {
    			fr = new FileReader(fichier);
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		BufferedReader inFile =  new BufferedReader (fr);
     
    		try{
    	    	while ((line  = inFile.readLine()) != null) {
     
    	                listeFichiers.add(line);
    	    	}
     
    	    } catch (IOException e) {
    	        System.out.println (e.getMessage());
    	        e.printStackTrace();
    	    } finally {
    	        try {
    				inFile.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    	    }
     
    		GridView gridView1;
    		GridViewAdapter customGridAdapter;
    		ArrayList<Item> gridArray = new ArrayList<Item>();
    		final Bitmap mp3Icon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.mp3);
    		final Bitmap zipIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.zip);
    		final Bitmap mp4Icon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.mp4);
    		final Bitmap txtIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.txt);
    		final Bitmap jpgIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.jpg);
    		final Bitmap aviIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.avi);
     
    		final Bitmap pdfIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.pdf);
    		final Bitmap rarIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.rar);
    		final Bitmap docIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.doc);
    		final Bitmap pngIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.png);
    		final Bitmap gifIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.gif);
    		final Bitmap wmaIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.wma);
     
    		final Bitmap troisgpIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.troisgp);
    		final Bitmap mkvIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.mkv);
     
    		final Bitmap movIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.mov);
    		final Bitmap wmvIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.wmv);
    		final Bitmap m4aIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.m4a);
    		final Bitmap htmlIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.html);
    		final Bitmap xmlIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.xml);
    		final Bitmap exeIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.exe);
    		final Bitmap bmpIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.bmp);
     
    		final Bitmap autreIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.autre);
    		final Bitmap apkIcon =  BitmapFactory.decodeResource(this.getResources(), R.drawable.apk);
    		final int end = (listeFichiers.size());
    		    while (i < end){
    		    	/**
                            try { 
                                              Thread.sleep(2000);
                                            }
                                            catch (InterruptedException exception) {
                                              exception.printStackTrace();
                                            }*/
    		    	String chemin = ("/storage" + (listeFichiers.get(i)));
    				Uri Chemin = Uri.parse(chemin);
    				File cheminPath = new File(Chemin.getPath());
    				String fileName = chemin.substring(chemin.lastIndexOf("/")+1);
    				final String FILEType = fileName.substring(fileName.lastIndexOf(".")+1);
    				final String  fileType = FILEType.toLowerCase();
    				if (fileType.equals("mp3")){
    					gridArray.add(new Item(mp3Icon,fileName));
    				}
    				else if (fileType.equals("zip")){
    					gridArray.add(new Item(zipIcon,fileName));
    				}
    				else if (fileType.equals("pdf")){
    					gridArray.add(new Item(pdfIcon,fileName));
    				}
    				else if (fileType.equals("rar")){
    					gridArray.add(new Item(rarIcon,fileName));
    				}
    				else if (fileType.equals("doc") || fileType.equals("docx") ){
    					gridArray.add(new Item(pdfIcon,fileName));
    				}
     
    				else if (fileType.equals("txt")){
    					gridArray.add(new Item(txtIcon,fileName));
    				}
    				else if (fileType.equals("jpg") || fileType.equals("png") || fileType.equals("gif") ){
     
    				     long idImage = getImageIdFromFilePath(chemin, getContentResolver());
     
     
     
    				     Bitmap thumbBitmap = MediaStore.Images.Thumbnails.getThumbnail(
                                 getContentResolver(), idImage,
                                 MediaStore.Images.Thumbnails.MINI_KIND,
                                 (BitmapFactory.Options) null );
    				            if ((thumbBitmap == null) && (fileType.equals("jpg")) ){ 
    							    gridArray.add(new Item(jpgIcon,fileName));
    							    }
    				            else if ((thumbBitmap == null) && (fileType.equals("png")) ){ 
    								gridArray.add(new Item(pngIcon,fileName));
    								}
    							else if ((thumbBitmap == null) && (fileType.equals("gif")) ){ 
    								gridArray.add(new Item(gifIcon,fileName));
    								}
    							else{
    					            gridArray.add(new Item(thumbBitmap,fileName));
    							    }
    				}
    				else if (fileType.equals("avi") || fileType.equals("mp4") || fileType.equals("mkv") || fileType.equals("3gp")){
     
     
    					long idVideo = getVideoIdFromFilePath(chemin, getContentResolver());
     
    					Bitmap thumbBitmap = MediaStore.Video.Thumbnails.getThumbnail(
                                 getContentResolver(), idVideo,
                                 MediaStore.Video.Thumbnails.MINI_KIND,
                                 (BitmapFactory.Options) null );
    					//Bitmap thumbBitmap = ThumbnailUtils.createVideoThumbnail(((File) cheminPath).getAbsolutePath(), MediaStore.Video.Thumbnails.MINI_KIND);
    					    if ((thumbBitmap == null) && (fileType.equals("avi")) ){ 
    						    gridArray.add(new Item(aviIcon,fileName));
    						    }
    						else if ( (thumbBitmap == null) &&(fileType.equals("mp4")) ){ 
    							gridArray.add(new Item(mp4Icon,fileName));
    							}
    						else if ((thumbBitmap == null) &&(fileType.equals("3gp")) ){ 
    							gridArray.add(new Item(troisgpIcon,fileName));
    							}
    						else if ((thumbBitmap == null) &&(fileType.equals("mkv")) ){ 
    							gridArray.add(new Item(mkvIcon,fileName));
    							}
    						else{
    					        gridArray.add(new Item(thumbBitmap,fileName));
    						}
    				}
    				else if (fileType.equals("apk")){
    					gridArray.add(new Item(apkIcon,fileName));
    				}
    				else {
    					gridArray.add(new Item(autreIcon,fileName));
    				}				
    			i=i+1;	
    		    }
     
    		gridView1 = (GridView) findViewById(R.id.gridView1);
    				customGridAdapter = new GridViewAdapter(this, R.layout.row_grid, gridArray);
    gridView1.setAdapter(customGridAdapter);    
    	}
    	private long getImageIdFromFilePath(String filePath,
    	        ContentResolver contentResolver) {
     
     
    	    long imageId;
    	    Log.d(TAG,"Loading file " + filePath);
     
     
    	    Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
     
    	    Log.d(TAG,"ImageUri = " + imageUri.toString());
     
    	    String[] projection = {MediaStore.Images.ImageColumns._ID};
     
     
    	    Cursor cursor = contentResolver.query(imageUri, projection, MediaStore.Images.ImageColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    	    cursor.moveToFirst();
     
    	    int columnIndex = cursor.getColumnIndex(projection[0]);
    	    imageId = cursor.getLong(columnIndex);
     
    	    Log.d(TAG,"Image ID is " + imageId);
    	    cursor.close();
    	    return imageId;
    	}
    	private long getVideoIdFromFilePath(String filePath,
    	        ContentResolver contentResolver) {
     
     
    	    long videoId;
    	    Log.d(TAG,"Loading file " + filePath);
     
     
    	    Uri videosUri = MediaStore.Video.Media.getContentUri("external");
     
    	    Log.d(TAG,"videosUri = " + videosUri.toString());
     
    	    String[] projection = {MediaStore.Video.VideoColumns._ID};
     
    	    // TODO This will break if we have no matching item in the MediaStore.
    	    Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    	    cursor.moveToFirst();
     
    	    int columnIndex = cursor.getColumnIndex(projection[0]);
    	    videoId = cursor.getLong(columnIndex);
     
    	    Log.d(TAG,"Video ID is " + videoId);
    	    cursor.close();
    	    return videoId;
    	}
    }
    la class qui gère les items:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package com.example.gridviewproject;
     
     
     
    import android.graphics.Bitmap;
     
    /**
     * 
     * @author manish.s
     *
     */
     
    public class Item {
    	Bitmap image;
    	String title;
     
     
    	public Item(Bitmap image, String title) {
    		super();
    		this.image = image;
    		this.title = title;
     
    	}
    	public Bitmap getImage() {
    		return image;
    	}
    	public void setImage(Bitmap image) {
    		this.image = image;
    	}
    	public String getTitle() {
    		return title;
    	}
    	public void setTitle(String title) {
    		this.title = title;
    	}
     
     
     
    }
    la class GridViewadapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    package com.example.gridviewproject;
     
    import java.util.ArrayList;
     
     
     
    import android.app.Activity;
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.CheckBox;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
     
    /**
     * 
     * @author manish.s
     *
     */
    public class GridViewAdapter extends ArrayAdapter<Item> {
    	Context context;
    	int layoutResourceId;
    	ArrayList<Item> data = new ArrayList<Item>();
     
    	public GridViewAdapter(Context context, int layoutResourceId,
    			ArrayList<Item> data) {
    		super(context, layoutResourceId, data);
    		this.layoutResourceId = layoutResourceId;
    		this.context = context;
    		this.data = data;
    	}
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		View row = convertView;
    		RecordHolder holder = null;
     
    		if (row == null) {
    			LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    			row = inflater.inflate(layoutResourceId, parent, false);
     
    			holder = new RecordHolder();
    			holder.txtTitle = (TextView) row.findViewById(R.id.item_text);
    			holder.imageItem = (ImageView) row.findViewById(R.id.item_image);
    			holder.checkBox = (CheckBox) row.findViewById(R.id.suppression);
    			row.setTag(holder);
    		} else {
    			holder = (RecordHolder) row.getTag();
    		}
     
    		holder.checkBox.setOnClickListener(new OnClickListener() {
     
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				CheckBox cb = (CheckBox) v;
    				//int id = cb.getId();
    				//Toast.makeText(this,"Enfant1 Annuler", Toast.LENGTH_SHORT).show();
    				/**
                                    if (thumbnailsselection[id]){
                                            cb.setChecked(false);
                                            thumbnailsselection[id] = false;
                                    } else {
                                            cb.setChecked(true);
                                            thumbnailsselection[id] = true;
                                    }*/
    			}
    		});
     
    		Item item = data.get(position);
     
    		holder.txtTitle.setText(item.getTitle());
    		holder.imageItem.setImageBitmap(item.getImage());
    		return row;
     
    	}
     
    	 class RecordHolder {
     
    		TextView txtTitle;
    		ImageView imageItem;
    		CheckBox checkBox;
     
    	}
    }
    Ce code fonctionne parfaitement et remplit son office.

    Mais dans mon projet final je voudrais que les cellules du gridview s'affichent une par une en fonction de l'avancement d'une tache (le téléchargement de ces chemins de fichiers contenu dans le fichier txt de départ)

    J'envisageais de modifier le code comme suit :

    MainActivity:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    package com.example.gridviewproject;
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
     
     
     
     
     
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.app.Activity;
    import android.content.ContentResolver;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.util.Log;
     
    import android.widget.GridView;
     
    public class MainActivity extends Activity {
    String racine;
    String fichier;
    String line;
    private String TAG = "test";
    int i =0;
    final ArrayList<String> listeFichiers = new ArrayList<String>();
     
     
     
    GridView gridView1;
    GridViewAdapter customGridAdapter;
     
     
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
     
    		File mCurrentFile = Environment.getExternalStorageDirectory();
    		racine = mCurrentFile.getPath();
    		fichier = (racine + "/fichier.txt");
     
     
    		FileReader fr = null;
    		try {
    			fr = new FileReader(fichier);
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		BufferedReader inFile =  new BufferedReader (fr);
     
    		try{
    	    	while ((line  = inFile.readLine()) != null) {
     
    	                listeFichiers.add(line);
    	    	}
     
    	    } catch (IOException e) {
    	        System.out.println (e.getMessage());
    	        e.printStackTrace();
    	    } finally {
    	        try {
    				inFile.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    	    }
     
    		new Thread(new GridViewThread()).start();
     
    	}
    	private long getImageIdFromFilePath(String filePath,
    	        ContentResolver contentResolver) {
     
     
    	    long imageId;
    	    Log.d(TAG,"Loading file " + filePath);
     
    	            // This returns us content://media/external/videos/media (or something like that)
    	            // I pass in "external" because that's the MediaStore's name for the external
    	            // storage on my device (the other possibility is "internal")
    	    Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
     
    	    Log.d(TAG,"videosUri = " + imageUri.toString());
     
    	    String[] projection = {MediaStore.Images.ImageColumns._ID};
     
    	    // TODO This will break if we have no matching item in the MediaStore.
    	    Cursor cursor = contentResolver.query(imageUri, projection, MediaStore.Images.ImageColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    	    cursor.moveToFirst();
     
    	    int columnIndex = cursor.getColumnIndex(projection[0]);
    	    imageId = cursor.getLong(columnIndex);
     
    	    Log.d(TAG,"Video ID is " + imageId);
    	    cursor.close();
    	    return imageId;
    	}
    	private long getVideoIdFromFilePath(String filePath,
    	        ContentResolver contentResolver) {
     
     
    	    long videoId;
    	    Log.d(TAG,"Loading file " + filePath);
     
    	            // This returns us content://media/external/videos/media (or something like that)
    	            // I pass in "external" because that's the MediaStore's name for the external
    	            // storage on my device (the other possibility is "internal")
    	    Uri videosUri = MediaStore.Video.Media.getContentUri("external");
     
    	    Log.d(TAG,"videosUri = " + videosUri.toString());
     
    	    String[] projection = {MediaStore.Video.VideoColumns._ID};
     
    	    // TODO This will break if we have no matching item in the MediaStore.
    	    Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    	    cursor.moveToFirst();
     
    	    int columnIndex = cursor.getColumnIndex(projection[0]);
    	    videoId = cursor.getLong(columnIndex);
     
    	    Log.d(TAG,"Video ID is " + videoId);
    	    cursor.close();
    	    return videoId;
    	}
     
    	class GridViewThread implements Runnable {
     
    		final Bitmap mp3Icon =  BitmapFactory.decodeResource(getResources(), R.drawable.mp3);
    		final Bitmap zipIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.zip);
    		final Bitmap mp4Icon =  BitmapFactory.decodeResource(getResources(), R.drawable.mp4);
    		final Bitmap txtIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.txt);
    		final Bitmap jpgIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.jpg);
    		final Bitmap aviIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.avi);
     
    		final Bitmap pdfIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.pdf);
    		final Bitmap rarIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.rar);
    		final Bitmap docIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.doc);
    		final Bitmap pngIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.png);
    		final Bitmap gifIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.gif);
    		final Bitmap wmaIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.wma);
     
    		final Bitmap troisgpIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.troisgp);
    		final Bitmap mkvIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.mkv);
     
    		final Bitmap movIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.mov);
    		final Bitmap wmvIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.wmv);
    		final Bitmap m4aIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.m4a);
    		final Bitmap htmlIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.html);
    		final Bitmap xmlIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.xml);
    		final Bitmap exeIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.exe);
    		final Bitmap bmpIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.bmp);
     
    		final Bitmap autreIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.autre);
    		final Bitmap apkIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.apk);
    		//GridView gridView1;
    		//GridViewAdapter customGridAdapter;
    		ArrayList<Item> gridArray = new ArrayList<Item>();
     
    		final int end = (listeFichiers.size());
    		public void run(){
    			while (i < end){
    				//simulation du temps de téléchargement
    		    	try { 
    					  Thread.sleep(2000);
    					}
    					catch (InterruptedException exception) {
    					  exception.printStackTrace();
    					}
    		    	String chemin = ("/storage" + (listeFichiers.get(i)));
    				Uri Chemin = Uri.parse(chemin);
    				//File cheminPath = new File(Chemin.getPath());
    				String fileName = chemin.substring(chemin.lastIndexOf("/")+1);
    				final String FILEType = fileName.substring(fileName.lastIndexOf(".")+1);
    				final String  fileType = FILEType.toLowerCase();
    				if (fileType.equals("mp3")){
    					gridArray.add(new Item(mp3Icon,fileName));
    				}
    				else if (fileType.equals("zip")){
    					gridArray.add(new Item(zipIcon,fileName));
    				}
    				else if (fileType.equals("pdf")){
    					gridArray.add(new Item(pdfIcon,fileName));
    				}
    				else if (fileType.equals("rar")){
    					gridArray.add(new Item(rarIcon,fileName));
    				}
    				else if (fileType.equals("doc") || fileType.equals("docx") ){
    					gridArray.add(new Item(pdfIcon,fileName));
    				}
     
     
    				else if (fileType.equals("mp4")){
    					gridArray.add(new Item(mp4Icon,fileName));
    				}
    				else if (fileType.equals("txt")){
    					gridArray.add(new Item(txtIcon,fileName));
    				}
    				else if (fileType.equals("jpg") || fileType.equals("png") || fileType.equals("gif") ){
    				     long idImage = getImageIdFromFilePath(chemin, getContentResolver());					
    				     Bitmap thumbBitmap = MediaStore.Images.Thumbnails.getThumbnail(
                                 getContentResolver(), idImage,
                                 MediaStore.Images.Thumbnails.MINI_KIND,
                                 (BitmapFactory.Options) null );
    				            if ((thumbBitmap == null) && (fileType.equals("jpg")) ){ 
    							    gridArray.add(new Item(jpgIcon,fileName));
    							    }
    				            else if ((thumbBitmap == null) && (fileType.equals("png")) ){ 
    								gridArray.add(new Item(pngIcon,fileName));
    								}
    							else if ((thumbBitmap == null) && (fileType.equals("gif")) ){ 
    								gridArray.add(new Item(gifIcon,fileName));
    								}
    							else{
    					            gridArray.add(new Item(thumbBitmap,fileName));
    							    }
    				}
    				else if (fileType.equals("avi") || fileType.equals("mp4") || fileType.equals("mkv") || fileType.equals("3gp")){
     
     
    					long idVideo = getVideoIdFromFilePath(chemin, getContentResolver());
     
     
     
    					Bitmap thumbBitmap = MediaStore.Video.Thumbnails.getThumbnail(
                                 getContentResolver(), idVideo,
                                 MediaStore.Video.Thumbnails.MINI_KIND,
                                 (BitmapFactory.Options) null );
    					//Bitmap thumbBitmap = ThumbnailUtils.createVideoThumbnail(((File) cheminPath).getAbsolutePath(), MediaStore.Video.Thumbnails.MINI_KIND);
    					    if ((thumbBitmap == null) && (fileType.equals("avi")) ){ 
    						    gridArray.add(new Item(aviIcon,fileName));
    						    }
    						else if ( (thumbBitmap == null) &&(fileType.equals("mp4")) ){ 
    							gridArray.add(new Item(mp4Icon,fileName));
    							}
    						else if ((thumbBitmap == null) &&(fileType.equals("3gp")) ){ 
    							gridArray.add(new Item(troisgpIcon,fileName));
    							}
    						else if ((thumbBitmap == null) &&(fileType.equals("mkv")) ){ 
    							gridArray.add(new Item(mkvIcon,fileName));
    							}
    						else{
    					        gridArray.add(new Item(thumbBitmap,fileName));
    						}
    				}
    				else if (fileType.equals("apk")){
    					gridArray.add(new Item(apkIcon,fileName));
    				}
    				else {
    					gridArray.add(new Item(autreIcon,fileName));
    				}
     
    				runOnUiThread(new Runnable() {
     
    					@Override
                        public void run() {
    			gridView1 = (GridView) findViewById(R.id.gridView1);
    			customGridAdapter = new GridViewAdapter(getBaseContext(), R.layout.row_grid, gridArray);
    			gridView1.setAdapter(customGridAdapter);
    					}
    				});
     
     
     
     
    			i=i+1;	
    		    }
     
     
    		}
    	}
     
    }
    Le soucis semble se situer sur le context de l'activité principale et ca coince avec :
    java.lang.ClassCastException: android.app.ContextImpl cannot be cast to android.app.Activity
    sur la ligne 43 de la class GridViewAdapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    Pourtant il me semble définir le context par la méthode getBaseContext() lorsque la class GridviewAdapter est appelée?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    customGridAdapter = new GridViewAdapter(getBaseContext(), R.layout.row_grid, gridArray);]
    J'avoue que la notion de context n'est pas encore très claire pour moi.

    Merci d'avance pour vos lumières .

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Il est très rare de devoir utiliser getBaseContext() il y a de fortes chances pour que ce soit d'ailleurs l'application elle-même.

    Le "context" décrit l'environnement d’exécution du code (filepath, package, ...), mais aussi de l'UI (thème, etc...). Chaque élément "clé" *est* un contexte: Service, Activity, et Application sont tous des contextes.
    Pourquoi appeler getBaseContext() donc ? D'autant que cette fonction est elle même une fonction du contexte qui récupère un contexte "parent"... Si on peut appeler cette fonction, on a déjà un contexte !

    D'autre part, la fonction tip-top pour récupérer une LayoutInflater est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LayoutInflater.from(context)
    Donc nul besoin de faire un "cast" (en langage fortement typé, le cast ne devrait jamais être nécessaire).


    Ce code fonctionne parfaitement et remplit son office.
    Il est tout de même brinquebalant...

    1. La gestion des exceptions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		FileReader fr = null;
    		try {
    			fr = new FileReader(fichier);
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		BufferedReader inFile =  new BufferedReader (fr);
    Déjà e.printStackTrace(); est à bannir sur Android, on lui préfère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.e(TAG,"Erreur de lecture du fichier",e);
    D'autre part, en cas d'erreur, ben, on ne s'arrête pas, et on continue sur BufferReader inFile = new BufferedReader(fr); => NullPointerException !

    Oui je sais je suis emmerdant avec la gestion des exceptions , mais un code propre permet souvent d'éviter les bugs inattendus !

    2. Lecture de l'ensemble des éléments en une seule passe, chez moi (et environ 2000 photos) il y a de fortes chances pour que le résultat soit un crash immédiat de l'application avec un OutOfMemoryError.

    Il faut stocker les informations dans Item (chemin d'accès à la bitmap), éventuellement surcharger les items en fonction du type de fichier (ImageItem, VideoItem, ...), et c'est dans le GridViewAdapter (getView) qu'on va transformer ces items en bitmap utilisable par l'interface. Ainsi, les seules bitmap "chargées" seront celles affichées.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Bonsoir,
    une fois de plus merci nicroman!

    Ce code n'était qu'un code de bidouille pour essayer de comprendre et adapter..tu me loupes jamais sur les "détails" et tu as bien raison!!

    Si j'ai bien compris le scan des éléments, pour obtenir l'id de l'image puis le thumbnail, risque de faire planter l’engin. Pour le moment ça n'a pas était le cas avec mon S2 et ma nexus7(2012) mais c'est une question que je me suis posée en constatant le temps de latence.

    Donc ce que tu me proposes c'est de rajouter un item à ma gridArray; donc dans mon code le path du fichier ; String chemin.

    Je comprends ça...mais en quoi ça va changer la donne quand je vais utiliser ma méthode getImageIdFromFilePath() pour obtenir l'id de l'image.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    private long getImageIdFromFilePath(String filePath,
    	        ContentResolver contentResolver) {
     
     
    	    long imageId;
    	    Log.d(TAG,"Loading file " + filePath);
     
     
    	    Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
     
    	    Log.d(TAG,"ImageUri = " + imageUri.toString());
     
    	    String[] projection = {MediaStore.Images.ImageColumns._ID};
     
     
    	    Cursor cursor = contentResolver.query(imageUri, projection, MediaStore.Images.ImageColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    	    cursor.moveToFirst();
     
    	    int columnIndex = cursor.getColumnIndex(projection[0]);
    	    imageId = cursor.getLong(columnIndex);
     
    	    Log.d(TAG,"Image ID is " + imageId);
    	    cursor.close();
    	    return imageId;
    	}
    ..au niveau du GridViewAdapter?

    Dans mon code je ne scanne que les fichiers ayant une extension spécifique (jpg,png....etc).

    Il y a un truc curieux : au début j'ai utilisé cette classe pour récupérer les thumbnail videos (ThumbnailUtils)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bitmap thumbBitmap = ThumbnailUtils.createVideoThumbnail(((File) cheminPath).getAbsolutePath(), MediaStore.Video.Thumbnails.MINI_KIND);
    le code est celui_ci:
    http://grepcode.com/file/repository....tring%2Cint%29

    par contre la méthode ThumbnailsUtils.createImageThumbnail() n'est pas possible alors qu'elle semble avoir était prévu dans la classe!?...mais n'est plus présente.

    Je veux bien que tu m'aiguilles davantage sur cette histoire de "délestage" du système de scan pour ne pas surcharger le bouzin..
    Ce que je n'arrive pas à saisir c'est l'action qui sature la mémoire: trouver l'Id de l'image en scannant tous les éléments ou créer le thumbnail avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Bitmap thumbBitmap = MediaStore.Images.Thumbnails.getThumbnail(
                                 getContentResolver(), idImage,
                                 MediaStore.Images.Thumbnails.MINI_KIND,
                                 (BitmapFactory.Options) null );
    Bonne nuit nicro.

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Bitmap est en particulier le type d'objet à éviter de conserver en mémoire si pas utilisé....

    On va dire qu'une bitmap "correcte" dans une grid-view fait 120x120dp... Sur un S4 justement, on va donc avoir 360x360 pixels... soit 518Ko par bitmap.
    Sachant qu'une application est limitée à disons 64Mo... cela ne laisse de la place que pour une centaine de ces bitmaps !

    Les "Adapter" (dont GridViewAdapter est une implémentation) permettent de recycler les "views", donc ne conserver en mémoire *que* les vues affichées (et deux ou trois en rab si besoin).

    La fonction getView() est appelée à chaque fois qu'une nouvelle view est affichée, et si une view précédente peut être recyclée, elle sera passée en paramètre.

    Donc on a:
    1 item (de la liste découverte en scannant le répertoire).
    1 view avec une ImageView probablement.
    le getView va alors récupérer de l'item la bitmap à afficher, et l'afficher.
    Si une bitmap était déjà affichée (view recyclée) elle sera donc "libérée" de la mémoire....

    Prenons le cas des Item:
    Au lieu d'avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class Item {
    	Bitmap image;
    	String title;
     
            public Bitmap getBitmap() { return image; }
    }
    On aura par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public abstract class Item {
            File file;
            String title;
     
            public abstract Bitmap getBitmap(Context ctxt);
     
            public File getFile() { return this.file; }
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class ImageItem extends Item {
            public Bitmap getBitmap(Context ctxt) {
                 return BitmapFactory.getBitmapFromFile(getFile());
            }
    }
    Et voilà... le GridViewAdapter n'utilise que la fonction getBitmap().

    Le truc qui popule la liste d'Item va mettre des ImageItem quand il s'agit d'images, des VideoItem quand ce sont des vidéos, etc... chaque sous classe implémentant sa propre fonction de création de Bitmap (on peut même retourner des ressources).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Bonjour nicroman,

    bon j'ai maintenant compris que c'étaient les items bitmap et l'accumulation de leur poids dans la gridArray qui posait un problème par rapport à la taille maxi de ram allouée par android.

    donc j'ai modifié le code comme suit en suivant tes indications:

    MainActivity:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    package com.example.gridviewproject;
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.app.Activity;
    import android.content.ContentResolver;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.util.Log;
    import android.widget.GridView;
     
    public class MainActivity extends Activity {
    String racine;
    String fichier;
    String line;
    GridView gridView1;
    GridViewAdapter customGridAdapter;
    int i =0;
    final ArrayList<String> listeFichiers = new ArrayList<String>();
     
       @Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
     
    		File mCurrentFile = (Environment.getExternalStorageDirectory());
    		racine = mCurrentFile.getPath();
    		fichier = (racine + "/.efs/fichier.txt");
     
     
    		FileReader fr = null;
    		try {
    			fr = new FileReader(fichier);
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		BufferedReader inFile =  new BufferedReader (fr);
     
    		try{
    	    	while ((line  = inFile.readLine()) != null) {
     
    	                listeFichiers.add(line);
    	    	}
     
    	    } catch (IOException e) {
    	        System.out.println (e.getMessage());
    	        e.printStackTrace();
    	    } finally {
    	        try {
    				inFile.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    	    }
     
    		new Thread(new GridViewThread()).start();
     
    	}
     
     
    	class GridViewThread implements Runnable {
     
    		ArrayList<Item> gridArray = new ArrayList<Item>();
     
    		final int end = (listeFichiers.size());
    		public void run(){
    			while (i < end){
    				//simulation du temps de téléchargement
    		    	try { 
    					  Thread.sleep(2000);
    					}
    					catch (InterruptedException exception) {
    					  exception.printStackTrace();
    					}
    		    		String chemin = ("/storage" + (listeFichiers.get(i)));
    		    		Uri path = Uri.parse(chemin);
    		    		File file = new File(path.getPath());
    		    		String fileName = chemin.substring(chemin.lastIndexOf("/")+1);
     
    		    		gridArray.add(new Item(file,fileName));
     
    		    		runOnUiThread(new Runnable() {
     
    					@Override
                        public void run() {
    						gridView1 = (GridView) findViewById(R.id.gridView1);
    						customGridAdapter = new GridViewAdapter(getBaseContext(), R.layout.row_grid, gridArray);
    						gridView1.setAdapter(customGridAdapter);
    					}
    				});
     
    			i=i+1;	
    		    }
     
     
    		}
    	}
     
    }
    classe Item:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    package com.example.gridviewproject;
     
     
     
    import java.io.File;
     
    import android.content.Context;
    import android.graphics.Bitmap;
     
     
    public abstract class Item {
    	File file;
    	String title;
     
    	public abstract Bitmap getBitmap(Context context);
    	public Item(File file, String title) {
    		super();
    		this.file = file;
    		this.title = title;
     
    	}
    	public File getFile() {
    		return  this.file ;
    	}
     
    	public String getTitle() {
    		return title;
    	}
    	public void setTitle(String title) {
    		this.title = title;
    	}
     
     
     
    }
    classe ImageItem:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package com.example.gridviewproject;
     
    import java.io.File;
     
    import android.content.Context;
    import android.content.res.Resources;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
     
    public class ImageItem extends Item {
    	public ImageItem(File file, String title) {
    		super(file, title);
    		this .file = file;
    		this.title = title;
    		// TODO Auto-generated constructor stub
    	}
    	final Bitmap autres =  BitmapFactory.decodeResource(getResources(), R.drawable.autre);
    	/**
            final Bitmap zipIcon =  BitmapFactory.decodeResource(getResources(), R.drawable.zip);
            final Bitmap mp4Icon =  BitmapFactory.decodeResource(getResources(), R.drawable.mp4);
            ...etc...d'autres définitions de mes icones dans le drawable
            */ 
     
     
    	public Bitmap getBitmap(Context context) {
    		String filePath = getFile().toString();
    		String fileType = title.substring(title.lastIndexOf(".")+1).toLowerCase();
    		if (fileType.equals("jpg")){
    		return BitmapFactory.decodeFile(filePath);	
    		}
    		else{
             return autres;
    		}
    		/**
                     * ..et d'autres conditions pour faire correspondre l'item bitmap en fonction de fileType
                     */
        }
     
    }
    et la classe GridViewAdapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    package com.example.gridviewproject;
     
    import java.util.ArrayList;
     
     
     
    import android.app.Activity;
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.CheckBox;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
     
     
    public class GridViewAdapter extends ArrayAdapter<Item> {
    	Context context;
    	int layoutResourceId;
    	ArrayList<Item> data = new ArrayList<Item>();
     
    	public GridViewAdapter(Context context, int layoutResourceId,
    			ArrayList<Item> data) {
    		super(context, layoutResourceId, data);
    		this.layoutResourceId = layoutResourceId;
    		this.context = context;
    		this.data = data;
    	}
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		View row = convertView;
    		RecordHolder holder = null;
     
    		if (row == null) {
    			LayoutInflater inflater = LayoutInflater.from(context);
    			row = inflater.inflate(layoutResourceId, parent, false);
     
    			holder = new RecordHolder();
    			holder.txtTitle = (TextView) row.findViewById(R.id.item_text);
    			holder.image = (ImageView) row.findViewById(R.id.item_image);
    			//holder.checkBox = (CheckBox) row.findViewById(R.id.suppression);
    			row.setTag(holder);
    		} else {
    			holder = (RecordHolder) row.getTag();
    		}
     
     
    		Item item = data.get(position);
    		ImageItem  imageItem = (ImageItem) data.get(position);
     
    		holder.txtTitle.setText(item.getTitle());
    		holder.image.setImageBitmap(imageItem.getBitmap(context));
    		return row;
     
    	}
     
    	 class RecordHolder {
     
    		TextView txtTitle;
    		ImageView image;
    		//CheckBox checkBox;
     
    	}
    }
    Ma première question serait : est-ce que je suis sur la bonne voie ou complètement à coté de la plaque??

    J'ai un premier soucis avec la ligne 91 de mon MainActivity:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gridArray.add(new Item(file,fileName));
    eclipse me dit : pas possible d'instancier Item.
    à priori ce n'est pas un problème d'arguments par rapport au constructeur de la class Item...??

    Le second est toujours lié, je pense, à cette satanée notion de context!!
    ligne 47 de ImageItem:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Bitmap autres =  BitmapFactory.decodeResource(getResources(), R.drawable.autre);
    this.getResource() ne passe pas et eclipse me demande donc de créer une méthode....et là dons mon esprit c'est le néant...j'ai vraiment du mal à ingérer et manipuler cette notion de contexte!

    Et enfin j'ai un gros doute sur la ligne 53 de GridViewAdapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageItem  imageItem = (ImageItem) data.get(position);
    voilà...merci de me soutenir nicro!

    Nota:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return BitmapFactory.getBitmapFromFile(getFile());
    getBitmapFromFile() ne passait pas..

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Oui c'est logique...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Bitmap autres =  BitmapFactory.decodeResource(getResources(), R.drawable.autre);
    est fait en dehors de tout contexte... hors il *faut* un contexte....

    Virer l'utilisation de "autres", et utiliser directement BitmapFactory.decodeResource(context.getResources(),R.drawable.autre);

    Pas d'inquiétude, BitmapFactory est sensé factoriser les bitmaps "partagées".


    En l'occurrence, je pense que ce n'est pas Bitmap que tu devrais utiliser, mais "Drawable" (mais c'est un autre problème)


    Ensuite, c'est tout l'interêt de l'orienté objets, et je pense que tu devrais regarder deux ou trois tutoriels sur l'héritage....
    Car, pour l'instanciation c'est normal... puisque Item est déclarée comme "abstraite" (n'implémente pas toutes les fonctionnalités).
    On a une liste d'"Item", mais dedans, on n'y met pas des Item, mais des ImageItem, ou des VideoItem...


    Donc le remplissage de la liste sera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    ArrayList<Item> list = new ArrayList<Item>();
    for (File f : directory.listFiles()) {  // <= ou un truc du genre
      String fileName = f.getName();
      int i = fileName.lastIndexOf('.');
      String ext = (i > 0) ? fileName.substring(i+1) : null;
      String title = (i > 0) ? fileName.substring(0,i) : fileName;
     
      Item item = null;
      if (ext != null) {
          if (ext.equalsIgnoreCase("jpg") || ext.equalsIgnoreCase("jpeg")) {
              item = new ImageItem(f,title);
          } else if (ext.equalsIgnoreCase("mpg")) {
              item = new VideoItem(f,title);
          }
              // autres cas ?
          }
      }
      if (item == null)
          item = new Item(f,title);
      list.add(item);
    }
    Ensuite.. Item peut ne *pas* être abtraite et implémenter le getBitmap avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public Bitmap getBitmap(Context ctxt)
    {
        return BitmapFactory.decodeResource(ctxt.getResources(),R.drawable.autres);
    }
    ImageItem:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public Bitmap getBitmap(Context ctxt)
    {
        return BitmapFactory.decodeFile(ctxt,getFile());  // bizarre, ce ne sera pas un thumbnail ici ! il y a plus de boulot comme ne récupérer qu'une "sous" résolution.
    }
    VideoItem:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public Bitmap getBitmap(Context ctxt)
    {
        return .... ; // <= récupération d'un thumbnail pour la vidéo.
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Bonjour nicroman,

    j'ai donc mis en place ta méthode et ça fonctionne évidement parfaitement.

    Le problème auquel je suis maintenant confronté c'est la fluidité de la gridview.

    Lorsque je mettais directement en mémoire le bitmap entant qu'item(1er version), le temps de chargement de la gridview était sensiblement plus important, mais une fois chargée était parfaitement fluide pour le scroll.
    Et pour cause, les bitmaps sont chargés en permanence en mémoire non?

    Quand il s'agit de bitmap à partir du répertoire drawable cela reste trés correct, encore qu'on pourrait surement optimiser en utilisant comme tu le disais drawable plutôt que bitmap.factory?

    Mais quand il s'agit de bitmap thumbnail, avec récupération de l'id:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    private long getImageIdFromFilePath(String filePath,
    	        ContentResolver contentResolver) {
     
     
    	    long imageId;
    	    Log.d(TAG,"Loading file " + filePath);
     
    	            // This returns us content://media/external/videos/media (or something like that)
    	            // I pass in "external" because that's the MediaStore's name for the external
    	            // storage on my device (the other possibility is "internal")
    	    Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
     
    	    Log.d(TAG,"videosUri = " + imageUri.toString());
     
    	    String[] projection = {MediaStore.Images.ImageColumns._ID};
     
    	    // TODO This will break if we have no matching item in the MediaStore.
     
    	    Cursor mcursor = contentResolver.query(imageUri, projection, MediaStore.Images.ImageColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    	    mcursor.moveToFirst();
     
    	    int columnIndex = mcursor.getColumnIndex(projection[0]);
    	    imageId = mcursor.getLong(columnIndex);
     
    	    Log.d(TAG,"Video ID is " + imageId);
    	    mcursor.close();
    	    return imageId;
     
     
    	}
    et récupération du bitmap avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    thumbBitmap = MediaStore.Images.Thumbnails.getThumbnail(
                         getContentResolver(), idImage,
                         MediaStore.Images.Thumbnails.MINI_KIND,
                         (BitmapFactory.Options) null );
    ça rame méchament!!

    Cette façon de récupérer le thumbnail est trop lourde et pas assez optimisée?
    Pourtant c'est celle qui semble être utilisée.

    Ou alors, et c'est ce que j'ai observé sur l'excellent SolideExplorer, les thumbnails ne sont pas chargées en même temps que le nom de fichier et autres dans la sous partie imageView du gridview ou listView...asyncTask?

    En tous cas merci nicro!!

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    En général oui, la récupération d'un thumbnail est une opération lourde...

    Il y a en effet 3 parties:
    * Récupération de l'identifiant du media.
    * Récupération du-dit thumbnail par une requête DB.
    * Transformation du thumbnail en bitmap.

    C'est effectivement le genre d'opération qu'on fait dans une tâche (AsyncTask) à part. A noter qu'utiliser un thread n'est pour le coup pas avantageux du tout, puisque l'AsyncTask est de base prévu pour effectuer "n" tâches simultanément (je crois 5) et les autres sont "empilées" pour execution future (alors qu'utiliser un thread reviendrait à lire les 50 thumbnails en parallèle rendant l'opération bien plus longue).

    L'AsyncTask est "assez" simple (sa seule complexité se situe dans le fait d'utiliser une WeakReference, pour éviter de "locker" l'ImageView par l'existence même de la tâche).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    class ItemLoaderTask extends AsyncTask<Context,Bitmap,Void>
    {
        private WeakReference<ImageView>  viewPtr;
        private Item  item;
     
        public BitmapLoaderTask(Item item, ImageView view)
        {
             this.viewPtr = new WeakReference<ImageView>(view);
             this.item = item;
        }
     
        protected Bitmap doInBackground(Context... params)
        {
             return this.item.getBitmap(context);
        }
     
        protected void onPostExecute(Bitmap bmp)
        {
             if (bmp != null) {
                 ImageView view = this.viewPtr.get();
                 if (view != null) 
                     view.setBitmap(bmp);
             }
        }
    }
    Son utilisation aussi dans l'adapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public View getView(AdapterView view, int position, View previous)
    {
        View ret = super.getView(view,position,previous);
     
        ImageView iv = ret.findViewById(R.id.imageView);
        new ItemLoaderTask(getItem(position),iv).execute(view.getContext());
    }
    Il peut être "utile" de stocker une map des tâches lancées par view (par exemple à partir du hashCode() de la view), afin de pouvoir appeler cancel() sur une tâche non encore terminée (et dont la view serait recyclée).




    Dans tous les cas... "LIKE ?" et bien plus long que "= ?" (surtout si la colonne est indexée).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Bonjour nicroman,

    donc j'ai essayé de mettre en place l'asyncTask mais avant je suis revenu à la version avec la classe Item en abstract, ce qui m'a permis de comprendre le principe des classes abstraites.

    ce qui donne pour la Main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    String chemin = ("/storage" + (listeFichiers.get(c)));
    		    		String fileName = chemin.substring(chemin.lastIndexOf("/")+1);
    		    		int i = fileName.lastIndexOf('.');
    		    		  String ext = (i > 0) ? fileName.substring(i+1) : null;
    		    		  String title = (i > 0) ? fileName.substring(0,i) : fileName;
    		    		  Item item = null;
     
     
    		    		      if (ext.equalsIgnoreCase("jpg") || ext.equalsIgnoreCase("jpeg") || ext.equalsIgnoreCase("png") || ext.equalsIgnoreCase("gif")) {
    		    		          item = new ImageItem(chemin,title);
    		    		      } 
    		    		      else if (ext.equalsIgnoreCase("mp4") || ext.equalsIgnoreCase("avi") || ext.equalsIgnoreCase("mkv") || ext.equalsIgnoreCase("3gp") ) {
    		    		          item = new VideoItem(chemin,title);
    		    		      }
    		    		      else {
    		    		    	  item = new IconeItem(chemin,title);
    		    		      }
    		    		      gridArray.add(item);
    pour Item:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public abstract class Item {
     
    	  String chemin;
    	  String title;
     
     
    	public Item( String chemin, String title) {
    		super();
     
    		this.chemin = chemin;
    		this.title = title;
     
    	}
    	public abstract Bitmap getBitmap(Context context);
     
        public String getFile() { return this.chemin; }
    	public String getTitle() {
    		return title;
    	}
    	public void setTitle(String title) {
    		this.title = title;
    	}
     
     
     
    }
    pour imageItem:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    public class ImageItem extends Item {
     
    	String TAG;
     
     
    	public ImageItem( String chemin, String title) {
    		super(chemin, title);
     
     
     
    	}
    	public Bitmap getBitmap(Context context){
    		    String ext =  getFile().substring(getFile().lastIndexOf(".")+1);
    		    Bitmap bitmap;
    			long idImage = getImageIdFromFilePath(chemin, context.getContentResolver());
    			bitmap = MediaStore.Images.Thumbnails.getThumbnail(
                        context.getContentResolver(), idImage,
                        MediaStore.Images.Thumbnails.MICRO_KIND,
                        (BitmapFactory.Options) null );
    			if ((bitmap == null) && (ext.equalsIgnoreCase("jpg")) ){ 
    				bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.jpg);
    			    }
                else if ((bitmap == null) && (ext.equalsIgnoreCase("png")) ){ 
                	bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.png);
    				}
    			else if ((bitmap == null) && (ext.equalsIgnoreCase("gif")) ){ 
    				bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.gif);
    				}
    			return bitmap;
    	}
    	private long getImageIdFromFilePath(String filePath,
    	        ContentResolver contentResolver) {
     
             // recherche de l'id
     
    	    return imageId;
    	}
     
     
    }
    VideoItem:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //meme principe que ImageItem
    IconeItem:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class IconeItem extends Item {
     
    	public IconeItem(String chemin, String title) {
    		super(chemin, title);
     
    	}
     
    	public Bitmap getBitmap(Context context){
    		String ext =  getFile().substring(getFile().lastIndexOf(".")+1);
    		Bitmap bitmap;
    		if (ext.equalsIgnoreCase("mp3")){
    			bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.mp3);
    		}
    		else if (ext.equalsIgnoreCase("zip")){
    			bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.zip);
    		}
    		// etc...
    		else {
    			bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.autre);
    		}
    		return bitmap;
    	}
     
    }
    ItemLoaderTask:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    class ItemLoaderTask extends AsyncTask<Context,Bitmap,Void>
    {
       private WeakReference<ImageView>  viewPtr;
       private Item  item;
       Context context;
     
     
       public ItemLoaderTask(Item item, ImageView view)
       {
            this.viewPtr = new WeakReference<ImageView>(view);
            this.item = item;
       }
     
       protected Bitmap doInBackground(Context... params)
       {
            return this.item.getBitmap(context);
       }
     
       protected void onPostExecute(Bitmap bmp)
       {
            if (bmp != null) {
                ImageView view = this.viewPtr.get();
                if (view != null) 
                    view.setImageBitmap(bmp);
            }
       }
    }
    GridViewAdapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    public class GridViewAdapter extends ArrayAdapter<Item> {
    	Context context;
    	int layoutResourceId;
    	private String TAG;
    	ArrayList<Item> data = new ArrayList<Item>();
     
    	public GridViewAdapter(Context context, int layoutResourceId,
    			ArrayList<Item> data ) {
    		super(context, layoutResourceId, data);
    		this.layoutResourceId = layoutResourceId;
    		this.context = context;
    		this.data = data;
     
    	}
     
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		View row = convertView;
    		RecordHolder holder = null;
     
    		if (row == null) {
    			LayoutInflater inflater = LayoutInflater.from(context);
    			row = inflater.inflate(layoutResourceId, parent, false);
     
    			holder = new RecordHolder();
    			holder.txtTitle = (TextView) row.findViewById(R.id.item_text);
    			holder.imageItem = (ImageView) row.findViewById(R.id.item_image);
    			holder.checkBox = (CheckBox) row.findViewById(R.id.suppression);
    			row.setTag(holder);
    		} else {
    			holder = (RecordHolder) row.getTag();
    		}
     
    		Item item = data.get(position);
    		holder.txtTitle.setText(item.getTitle());
    		new ItemLoaderTask(getItem(position),holder.imageItem).execute(convertView.getContext());
     
    		return row;
     
    	}
     
     
    	 class RecordHolder {
     
    		TextView txtTitle;
     
    		ImageView imageItem;
     
    		CheckBox checkBox;
     
    	}
    }
    Ce que je n'arrive pas à comprendre c'est qu'eclipse n'accepte pas la méthode dans ItemLoaderTask :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     protected Bitmap doInBackground(Context... params)
       {
            return this.item.getBitmap(context);
       }
    il m'impose une méthode void, donc pas de retour par la méthode abstract getBitmap(Context context) de la classe Item??

    Est-ce que je suis ok au niveau du l'adapter(ligne 37)? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new ItemLoaderTask(getItem(position),holder.imageItem).execute(convertView.getContext());
    Encore merci nicro...je progresse petit à petit..

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Honnêtement je n'ai pas essayé de compiler, et j'ai fait du "pseudo-code" basé sur mes souvenirs

    AsyncTask est une classe "générique", avec 3 généricités: disons les types "INPUT", "PROGRESS" et "OUTPUT"

    Celà s'écrit : AsyncTask<INPUT,PROGRESS,OUTPUT>

    Ensuite les fonctions en découlent:
    OUTPUT doInBackground(INPUT ... params)
    {
    }

    et

    void onPostExecute(OUTPUT out)
    {
    }

    Mais normalement on écrite "AsyncTask", et l'auto-completion d'eclipse fait le reste, on n'a plus qu'à remplacer les paramètres.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Salut nicro,
    bon ça ne veut pas le faire!!

    En lisant quelques trucs sur l'asyncTask j'ai modifié celle ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package com.example.gridviewproject;
     
    import java.lang.ref.WeakReference;
     
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.os.AsyncTask;
    import android.widget.ImageView;
     
     
     
     
    class ItemLoaderTask extends AsyncTask<Context,Void,Bitmap>
    {
       private WeakReference<ImageView>  viewPtr;
       private Item  item;
       Context context ;
     
     
       public ItemLoaderTask(Item item, ImageView view)
       {
            this.viewPtr = new WeakReference<ImageView>(view);
            this.item = item;
       }
     
       protected Bitmap doInBackground(Context... params)
       {
            return this.item.getBitmap(context);
       }
     
       protected void onPostExecute(Bitmap bitmap)
       {
            if (bitmap != null) {
                ImageView view = this.viewPtr.get();
                if (view != null) 
                    view.setImageBitmap(bitmap);
            }
       }
    }
    donc avec Context en input, Void en progress et Bitmap en output..
    A ce niveau là éclipse me dit ok!

    mon GridViewAdapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    package com.example.gridviewproject;
     
    import java.util.ArrayList;
     
     
     
     
     
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.CheckBox;
    import android.widget.ImageView;
    import android.widget.TextView;
     
     
    /**
     * 
     * @author manish.s
     *
     */
    public class GridViewAdapter extends ArrayAdapter<Item> {
    	Context context;
    	int layoutResourceId;
     
    	ArrayList<Item> data = new ArrayList<Item>();
     
    	public GridViewAdapter(Context context, int layoutResourceId,
    			ArrayList<Item> data ) {
    		super(context, layoutResourceId, data);
    		this.layoutResourceId = layoutResourceId;
    		this.context = context;
    		this.data = data;
     
    	}
     
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		View row = convertView;
    		RecordHolder holder = null;
     
    		if (row == null) {
    			LayoutInflater inflater = LayoutInflater.from(context);
    			row = inflater.inflate(layoutResourceId, parent, false);
     
    			holder = new RecordHolder();
    			holder.txtTitle = (TextView) row.findViewById(R.id.item_text);
    			holder.imageItem = (ImageView) row.findViewById(R.id.item_image);
    			//holder.checkBox = (CheckBox) row.findViewById(R.id.suppression);
    			row.setTag(holder);
    		} else {
    			holder = (RecordHolder) row.getTag();
    		}
     
    		Item item = data.get(position);
    		holder.txtTitle.setText(item.getTitle());
    		//holder.imageItem.setImageBitmap(item.getBitmap(context));
    		new ItemLoaderTask(item,holder.imageItem).execute(row.getContext());
     
    		return row;
     
    	}
     
     
    	 class RecordHolder {
     
    		TextView txtTitle;
     
    		ImageView imageItem;
     
    		//CheckBox checkBox;
     
    	}
    }
    Quand je lance...ce me fait un beau RuntimeException sur la méthode doInBackGround() de ItemLoaderTask:
    12-10 16:33:20.522: E/AndroidRuntime(4635): FATAL EXCEPTION: AsyncTask #1
    12-10 16:33:20.522: E/AndroidRuntime(4635): java.lang.RuntimeException: An error occured while executing doInBackground()
    12-10 16:33:20.522: E/AndroidRuntime(4635): at android.os.AsyncTask$3.done(AsyncTask.java:299)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at java.lang.Thread.run(Thread.java:841)
    12-10 16:33:20.522: E/AndroidRuntime(4635): Caused by: java.lang.NullPointerException
    12-10 16:33:20.522: E/AndroidRuntime(4635): at com.example.gridviewproject.ImageItem.getBitmap(ImageItem.java:26)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at com.example.gridviewproject.ItemLoaderTask.doInBackground(ItemLoaderTask.java:28)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at com.example.gridviewproject.ItemLoaderTask.doInBackground(ItemLoaderTask.java:1)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at android.os.AsyncTask$2.call(AsyncTask.java:287)
    12-10 16:33:20.522: E/AndroidRuntime(4635): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
    pourtant quand "j'instancie" l'ItemLoaderTask dans GridViewAdapter il me semble que je passe les bons arguments...en tout cas ceux attendu par le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Item item = data.get(position);
    new ItemLoaderTask(item,holder.imageItem).execute(row.getContext());
    et voici mes Layouts:
    mainactivity:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#606060"
     
         >
     
        <GridView
            android:id="@+id/gridView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
     
            android:verticalSpacing="1dp"
            android:horizontalSpacing="1dp"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:numColumns="auto_fit"
            android:columnWidth="100dp"
            android:stretchMode="columnWidth"
            android:gravity="center"
     
     
     
             >
     
        </GridView>
     
    </RelativeLayout>
    et rowgrid:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#CECECE"
        android:padding="5dp" >
     
         <ImageView
            android:id="@+id/item_image"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:layout_gravity="center_vertical|center_horizontal"
     
            android:src="@drawable/mp3" >
        </ImageView>
     
        <TextView
            android:id="@+id/item_text"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:layout_alignLeft="@+id/item_image"
            android:layout_below="@+id/item_image"
            android:gravity="center_vertical|center_horizontal"
            android:text="text"
            android:textSize="10sp"
            android:textStyle="bold" />
     
        <CheckBox
            android:id="@+id/suppression"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_alignBottom="@+id/item_text"
            android:layout_alignParentLeft="true"
            android:layout_alignRight="@+id/item_image"
            android:layout_alignTop="@+id/item_image" />
     
    </RelativeLayout>
    Le code opère normalement sans mettre en jeux l'asyncTask.
    No comprendo nada!!

    Merci pour ton aide.

  12. #12
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Le but justement est de ne pas conserver de liens vers un context dans l'asynctask...

    Donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    package com.example.gridviewproject;
     
    import java.lang.ref.WeakReference;
     
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.os.AsyncTask;
    import android.widget.ImageView;
     
     
     
     
    class ItemLoaderTask extends AsyncTask<Context,Void,Bitmap>
    {
       private WeakReference<ImageView>  viewPtr;
       private Item  item;
     
       public ItemLoaderTask(Item item, ImageView view)
       {
            this.viewPtr = new WeakReference<ImageView>(view);
            this.item = item;
       }
     
       protected Bitmap doInBackground(Context... params)
       {
            return this.item.getBitmap(params[0]); // <= il est là le contexte passé en paramètre à execute !
       }
     
       protected void onPostExecute(Bitmap bitmap)
       {
            if (bitmap != null) {
                ImageView view = this.viewPtr.get();
                if (view != null) 
                    view.setImageBitmap(bitmap);
            }
       }
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Bonsoir nicro,

    désolé pour le retard de mes remerciements mais j'ai pas eu le temps de te répondre!

    Et oui...encore cette histoire de context...et surtout la sélection du paramètre dans le doInBackground().

    Je commence à saisir un certain nombre de choses. Tout n'est pas clair mais ça vient!!

    La notion la plus abstraite reste pour moi cette notion de contexte. J'ai du mal à faire coller le sens littéral du mot et son concept appliqué au android.

    En tout cas grand merci à toi!

    Je va reviendre car un soucis de checkBox aléatoire pointe le bout de son nez..

    Je peux passer ce thread en résolu, ou continuer dessus?

  14. #14
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Je peux passer ce thread en résolu, ou continuer dessus?
    Si tu as eu la réponse à ta question --> Résolu.

    Si tu penses qu'il manque encore quelques précisions, tu continues sur ce thread .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

Discussions similaires

  1. [Framework] representer un HashMap dans un fichier context
    Par nadhem dans le forum Spring
    Réponses: 2
    Dernier message: 10/09/2007, 16h39
  2. [FTP] fopen qui ne fonctionne pas dans tous les contextes ..
    Par Christophe Charron dans le forum Langage
    Réponses: 6
    Dernier message: 15/06/2006, 10h25
  3. appel système opendir dans thread
    Par madimane dans le forum POSIX
    Réponses: 2
    Dernier message: 14/04/2006, 05h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo