Paresseux de télécharger des images dans gridView
Dans mon application, j'ai besoin de télécharger un grand nombre de photos à partir d'url et de les afficher dans un contrôle gridView. (Il peut être entre 1-200 photos). Je ne veux pas de télécharger toutes les images à la fois. J'ai lu sur paresseux téléchargement et ma question est: puis-je obtenir seulement une partie du Json, télécharger les images dans un autre thread, et seulement si l'utilisateur de faire défiler le contrôle gridView, je vais continuer à les autres parties du Json, et ainsi de suite?
Edit: Salut à nouveau. Je veux mettre en œuvre une multi sélection dans cette gridView et je vais avoir de la difficulté à mettre en œuvre le code de la getView() la méthode de l'adaptateur. C'est l'exemple que j'utilise:exemple. Comment puis-je combiner ce code dans mon getView() méthode:
public View getView(int position, View convertView, ViewGroup parent) {
CheckableLayout l;
ImageView i;
if (convertView == null) {
i = new ImageView(Grid3.this);
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
i.setLayoutParams(new ViewGroup.LayoutParams(50, 50));
l = new CheckableLayout(Grid3.this);
l.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.WRAP_CONTENT,
GridView.LayoutParams.WRAP_CONTENT));
l.addView(i);
} else {
l = (CheckableLayout) convertView;
i = (ImageView) l.getChildAt(0);
}
ResolveInfo info = mApps.get(position);
i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));
return l;
}
public class CheckableLayout extends FrameLayout implements Checkable {
private boolean mChecked;
public CheckableLayout(Context context) {
super(context);
}
public void setChecked(boolean checked) {
mChecked = checked;
setBackgroundDrawable(checked ?
getResources().getDrawable(R.drawable.blue)
: null);
}
public boolean isChecked() {
return mChecked;
}
public void toggle() {
setChecked(!mChecked);
}
}
mon getView() code:
public View getView(int position, View convertView, ViewGroup parent) {
//TODO Auto-generated method stub
ViewHolder holder;
View vi = convertView;
if(convertView == null) {
vi = inflater.inflate(com.egedsoft.instaprint.R.layout.item_clickable, null);
holder = new ViewHolder();
holder.imgPhoto = (ImageView)vi.findViewById(com.egedsoft.instaprint.R.id.imageClickable);
vi.setTag(holder);
} else {
holder = (ViewHolder) vi.getTag();
}
if (!arrayUrls.get(position).getThumbnailUrl().isEmpty()){
imageLoader.DisplayImage(arrayUrls.get(position).getThumbnailUrl(), holder.imgPhoto);
}
return vi;
}
- Comment allez-vous faire une demande pour obtenir les données JSON? La prise en charge des sources de pagination?
- Je reçois le "prochain" url de la source dans le cas où il n'y a plus de photos à charger
- Lele: je vous serais reconnaissant si vous pouvez regarder sur mon édité question. Je vous remercie beaucoup pour votre aide.
- J'ai peur, je n'ai jamais eu à utiliser une Grille de point de Vue avec la sélection. Vous devriez poster une autre question pour que.
Vous devez vous connecter pour publier un commentaire.
C'est comment j'ai récupérer plusieurs photos dans mon activité. Vous pouvez utiliser des pièces de il pour s'adapter à votre logique. Je l'utilise pour récupérer Facebook des Images d'un Album. Donc, mes besoins sont (je suppose) différente de vos besoins. Mais encore une fois, la logique peut être utiliser pour vous.
Remarque: Cela va être long. 😉
Ce sont les déclarations globales pour une utilisation par le biais de l'Activité:
C'est le bloc de code qui récupère la première série d'Images:
C'est pour détecter lorsque l'utilisateur a fait défiler jusqu'à la fin et de chercher ensemble de nouvelles images:
Et finalement, c'est la façon dont j'extrais la prochaine série d'images:
Et c'est la classe d'aide à
SET
etGET
les données recueillies à partir des requêtes ci-dessus:Si vous aussi vous voulez le
adapter
code, laissez-moi savoir. J'utilise Fedor est Chargement Différé méthode dans l'adaptateur.Ouf. Espérons tout de cette aide. Si vous avez d'autres question, n'hésitez pas à demander. 🙂
EDIT: code d'Adaptateur ajouté:
EDIT: Ajout d'étapes à montrer les Progrès réalisés pendant le chargement:
Ajouter une Barre de progression pour vous XML où vous avez le contrôle GridView à droite juste en dessous. Jouer avec le poids s'il cause des problèmes.
Dans votre Java, déclarer la
Linearlayout linlaProgressBar
Global et la lancer dans leonCreate()
et définir la visibilité d'linlaProgressBar.setVisibility(View.GONE);
Et dans le
onPreExecute()
l'utiliser comme ceci:Et enfin ajouter, et ce, dans le
onPostExecute()
Adapter
code a été ajouté à la poste.res
dossier: wptrafficanalyzer.en/blog/.... LegetPhotos
est un assez standard Setter / Getter fichier de classe.getPhotosData
et laloadMorePhotos
les classes sont en Activité. LeloadMorePhotos
est appelée que lorsque l'utilisateur a défilé vers le bas de la page, ce qui est pris en charge dans lasetOnScrollListener
définis dans leonCreate()
.ImageLoader
code de trop??ImageLoader
. Mais lorsque j'essaie d'exécuter le codehttps:\\graph.facebook.com` returns me null data. Applying same querying on
Api Graphique Explorer " renvoie-moi de corriger les données.Si u quelques secondes, puis jetez un oeil ici stackoverflow.com/questions/14861003/...arrPhotos
est globalement défini comme:ArrayList<getPhotos> arrPhotos
dans lequelgetPhotos
est la classe POJO permet de DÉFINIR et de gérer les différentes données renvoyées. J'ai gardé quelques choses à garder les post aussi court que possible. Espérons que cette aide.getPhotosData
est en effet appelé à laonCreate()
avec ceci:new getPhotosData().execute();
Désolé pour vous faire deviner. Je mettrai à jour le post avec un peu d'autres choses dès que je me rappelle où je l'ai stocké la source (c'est assez vieux maintenant :-))visibleItemCount
que le nombre d'éléments affichés.Vous pouvez prendre un coup d'oeil à À l'aide de l'adaptateur de Vues et GridView à partir de l'Android à la Documentation.
La chose la plus importante est que l'adaptateur d'appeler la méthode
getView
passant seulement de la position des entrées d'afficher sur l'écran, et en demandant des positions différentes lorsque l'utilisateur fait défiler.Le moyen facile de le faire est de télécharger l'image sur le
getView
méthode de votre carte avec et AsyncTask.Il y a un exemple
Parler de l'expérience, il est difficile de parvenir à défilement lisse (et la réactivité globale) alors que la consommation de la mémoire raisonnablement.
Ce serait une bonne idée de chercher des solutions existantes d'abord, par exemple, commencer ici:
Chargement différé des images dans la ListView
Nous nous sommes retrouvés avec une coutume solution propriétaire. C'est un thread d'arrière-plan que les files d'attente de téléchargement des demandes et des téléchargements et des caches sur le stockage externe uniquement les images qui sont encore visibles. Lorsqu'une nouvelle image arrive, la vue est informé et décide de notifier à l'adaptateur de mise à jour.
Il permet aussi d'économiser de la bande passante, ce qui est important dans certains cas.
J'ai trouvé IceMAN est réponse très utile, mais je recommande aussi d'éviter à l'aide de deux AsyncTasks et vous pouvez faire cela très facilement.
Vous devez créer une méthode universelle pour récupérer les données nécessaires, où vous pouvez faire un if/else condition (par exemple):
addMovies est un booléen dans votre onScroll méthode.
Dans AsyncTask fournir de la page actuelle dans l'URL de la requête et voila, vous avez fait votre code plus petits 🙂