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;
}
Vérifiez ce lien: https://developer.android.com/training/improving-layouts/smooth-scrolling.html. Ou essayez d'utiliser RecycleView –
Les images sont chargées .. la tâche asynch fait cela. Mais après le chargement des images, il défile si lentement –
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