2017-08-10 3 views
0

J'utilise une vue en grille qui gonfle la custom_layout de la mise en page. La vue en grille charge les vidéos du téléphone et les remplit sous la forme de vignettes. Tout fonctionne bien. Il y a un problème dans le défilement de la vue de la grille. Il est lent et le défilement dans le téléphone dont l'API> 20 donne le message L'application ne répond pasLa galerie de vidéos ne défile pas en douceur

J'ai suivi ce lien, mais n'a pas trouvé la solution parfaite: Gridview is scrolling slow

J'ai tâche asynchrone utilisée pour charger les vidéos de la galerie. Je donne le code pour la même chose. Voici mon fragment:

1. AddFragment.java

public class AddFragment extends Fragment { 

private ImageButton imageButton; 
private GridView gridView; 
private ProgressDialog videoProgressDialog; 
ArrayList<File> list = new ArrayList<>(); 
ImageAdapter imageAdapter; 

public AddFragment() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_add, container, false); 

    imageButton = (ImageButton) view.findViewById(R.id.gotoButton); 

    gridView = (GridView) view.findViewById(R.id.grid_view); 
    gridView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    Log.e("ADD_VIDEOS","FRAGMENT CREATED"); 
    videoProgressDialog = new ProgressDialog(getContext()); 
    videoProgressDialog.setTitle("Loading Videos"); 
    videoProgressDialog.setMessage("please wait....."); 
    videoProgressDialog.setCancelable(false); 
    videoProgressDialog.show(); 

    LoadVideoTask videoTask = new LoadVideoTask(); 
    videoTask.execute(new File("/mnt")); 

    return view; 
} 

//reading the file from the storage 
void videoReader(File root) { 


    File[] file = root.listFiles(); 

    if (file != null) { 

     for (File aFile : file) { 
      if (!aFile.isDirectory()) { 
       if (aFile.getName().endsWith(".mp4")) { 
        Log.e("VIDEO_FILE=====", aFile.getName()); 
        list.add(aFile); 
       } 
      } else 
       videoReader(aFile); 
     } 
    } else{} 
} 

//Show hide select button if images are selected or deselected 
public void showSelectButton() { 
    ArrayList<String> selectedItems = imageAdapter.getCheckedItems(); 
    Log.e("CHECKED_ITEMS",imageAdapter.getCheckedItems().toString()); 
    if (selectedItems.size() > 0) { 
     imageButton.setVisibility(View.VISIBLE); 
    } else 
     imageButton.setVisibility(View.GONE); 

} 

class ImageAdapter extends BaseAdapter { 


    private Bitmap bitmap; 

    private LayoutInflater inflater; 
    SparseBooleanArray mSparseBooleanArray; 

    private final Context context; 

    private ImageAdapter(Context c) { 
     context = c; 
     //changes done from here 
     mSparseBooleanArray = new SparseBooleanArray(); 

    } 

    //Method to return selected Images 
    public ArrayList<String> getCheckedItems() { 
     ArrayList<String> mTempArry = new ArrayList<String>(); 

     for (int i = 0; i < list.size(); i++) { 
      if (mSparseBooleanArray.get(i)) { 
       mTempArry.add(list.get(i).toString()); 
      } 
     } 

     return mTempArry; 
    } 


    //for the video numbers 
    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    //for getting the video items position vise 
    @Override 
    public Object getItem(int position) { 
     return list.get(position); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 

     View v; 

     if (convertView == null) { 

      inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.custom_gridview,viewGroup,false); 
      v.setLayoutParams(new AbsListView.LayoutParams(215,215)); 

     } else { 
      // picturesView = (ImageView) convertView; 
      v = (View)convertView; 
     } 

     Viewholder viewHolder = new Viewholder(v); 
     //viewHolder.imageView.setId(position); 
     viewHolder.id = position; 
     //convertView.setTag(viewHolder); 

     //loading images from the videos 
     if (list.get(position).toString().contains(".jpg")) { 
      bitmap = BitmapFactory.decodeFile(list.get(position).toString()); //Creation of Thumbnail of image 
      // viewHolder.imageView.setImageBitmap(bitmap); 
     } else { 
      if (list.get(position).toString().contains(".mp4")) { 
       bitmap = ThumbnailUtils.createVideoThumbnail(list.get(position).toString(), 1); //Creation of Thumbnail of video 
       viewHolder.imageView.setImageBitmap(bitmap); 
      } 
     } 

     //picturesView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     //picturesView.setAdjustViewBounds(true); 
     //picturesView.setLayoutParams(new GridView.LayoutParams(215, 215)); 
     //picturesView.setImageBitmap(bitmap); 
     //setting layout params for every device 

     viewHolder.checkBox.setTag(position); 
     viewHolder.checkBox.setChecked(mSparseBooleanArray.get(position)); 
     CompoundButton.OnCheckedChangeListener mCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
       mSparseBooleanArray.put((Integer) compoundButton.getTag(), isChecked);//Insert selected checkbox value inside boolean array 
       showSelectButton(); 
      } 
     }; 
     viewHolder.checkBox.setOnCheckedChangeListener(mCheckedChangeListener); 


     //return picturesView; 
     return v; 

    } 

    class Viewholder { 
     public ImageView imageView; 
     public CheckBox checkBox; 
     public int id; 
     public Viewholder(View v){ 
      imageView = (ImageView) v.findViewById(R.id.galleryImageView); 
      checkBox = (CheckBox) v.findViewById(R.id.selectCheckBox); 
     } 
    } 
} 

//asynch task has been done to do the processing in the background for loading the videos 
//three parametres are Params,Progress,Result 
private class LoadVideoTask extends AsyncTask<File,Integer, Integer>{ 


    @Override 
    protected Integer doInBackground(File... files) { 
     for(int i=0;i<files.length;i++) { 
      videoReader(files[i]); 
      Log.e("VIDEO_LOAD", files[i].toString()); 
     } 
     return files.length; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     videoProgressDialog.setProgress(values[0]); 
    } 

    @Override 
    protected void onPostExecute(Integer integer) { 
     super.onPostExecute(integer); 
     updateUI(); 
    } 
} 

private void updateUI() { 

    videoProgressDialog.dismiss(); 
    //calling imageadapter class in here 
    imageAdapter = new ImageAdapter(getContext()); 
    //for not repeating of the files 
    LinkedHashSet<File> fileList = new LinkedHashSet<>(); 
    fileList.addAll(list); 
    list.clear(); 
    list.addAll(fileList); 
    gridView.setAdapter(imageAdapter); 

    imageButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(getContext(), EditVideoActivity.class); 
      intent.putExtra("sendData", imageAdapter.getCheckedItems()); //passing the data 
      Log.e("SEND_DATA", imageAdapter.getCheckedItems().toString()); 
      startActivity(intent); 
     } 
    }); 
}} 

Comme il y a beaucoup de données et je sais en raison de données lourdes, il ne défile pas lent. J'ai besoin d'une solution pour ça. Merci d'avance.

Permet de modifier

Après avoir suivi ce lien, je suis un résultat et fait quelques changements dans la getView() en fonction de la solution, qui ne résout pas mon problème.

Lien: GridView Smooth Scrolling Solution

Mon getView() est comme ça maintenant:

méthode getView() dans ma classe adaptateur

@Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 


     Viewholder viewHolder = null; 

     if (convertView == null) { 

      viewHolder = new Viewholder(); 

      inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.custom_gridview,viewGroup,false); 
      convertView.setLayoutParams(new AbsListView.LayoutParams(215,215)); 

      convertView.setTag(viewHolder); 

     } else { 
      viewHolder = (Viewholder) convertView.getTag(); 
     } 

     viewHolder.imageView = (ImageView) convertView.findViewById(R.id.galleryImageView); 
     viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.selectCheckBox); 
     viewHolder.id = position; 

     //loading images from the videos 
     if (list.get(position).toString().contains(".jpg")) { 
      bitmap = BitmapFactory.decodeFile(list.get(position).toString()); //Creation of Thumbnail of image 
      // viewHolder.imageView.setImageBitmap(bitmap); 
     } else { 
      if (list.get(position).toString().contains(".mp4")) { 
       bitmap = ThumbnailUtils.createVideoThumbnail(list.get(position).toString(), 1); //Creation of Thumbnail of video 
       viewHolder.imageView.setImageBitmap(bitmap); 
      } 
     } 

     viewHolder.checkBox.setTag(position); 
     viewHolder.checkBox.setChecked(mSparseBooleanArray.get(position)); 
     CompoundButton.OnCheckedChangeListener mCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
       mSparseBooleanArray.put((Integer) compoundButton.getTag(), isChecked);//Insert selected checkbox value inside boolean array 
       showSelectButton(); 
      } 
     }; 
     viewHolder.checkBox.setOnCheckedChangeListener(mCheckedChangeListener); 

     return convertView; 

    } 
+0

Vérifiez ce lien: https://developer.android.com/training/improving-layouts/smooth-scrolling.html. Ou essayez d'utiliser RecycleView –

+0

Les images sont chargées .. la tâche asynch fait cela. Mais après le chargement des images, il défile si lentement –

+0

Est-ce la manipulation de l'image qui cause la lenteur? Vous décodez un bitmap ou créez une miniature à partir d'un .mp4 chaque fois que 'getView()' est appelé. Cela doit prendre du temps. Cela peut-il être fait à l'avance sur un thread d'arrière-plan peut-être partie de l'AsyncTask? – Cheticamp

Répondre

0

bitmaps peut épuiser très facilement le budget de la mémoire d'une application .

Si votre application charge plusieurs images bitmap en mémoire, vous devez gérer habilement la mémoire et la mise en cache du disque. Donc, chaque fois que vous chargez des images à partir des vidéos, il doit épuiser le budget de la mémoire d'une application.

Je recommande d'utiliser la bibliothèque Picasso. (http://square.github.io/picasso/)

Picasso.with(context).load(new File(YOUR_FILE_PATH)).into(imageView); 

Vous devez changer dans votre code source.

if (list.get(position).toString().contains(".mp4")) { 
      bitmap = ThumbnailUtils.createVideoThumbnail(list.get(position).toString(), 1); //Creation of Thumbnail of video 
      Picasso.with(context).load(getImageUri(context, bitmap)).into(viewHolder.imageView);} 

public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
    return Uri.parse(path); 
} 

Aussi s'il vous plaît le lire

solving-the-android-image-loading-problem-volley-vs-picasso/

Handling Bitmaps

+0

Je vais essayer de vous dire le résultat –

+0

Je l'ai fait il y avait quelques changements si comme, nouveau fichier (list.get (position) .toString()) et oui le ** dans n'est pas résolu car il montre le Impossible de résoudre en (android.widget.imageView) ** et encore une chose où sera la chose bitmap utilisée? –

+0

s'il vous plaît le relire. J'ai changé – redAllocator