Android à l'Aide de GridView avec OnScrollListener
Je suis en train de construire un gridview qui contient beaucoup d'images susceptibles autour de 1000++ photos. Pour réduire le temps de chargement pour le contrôle gridview, je veux mettre en œuvre un onScrollListener à l'aide de AbsListView. Je vais limite de 20 images par vue, puis lors du défilement atteigne le fond il va charger un autre de 20 images. Cette fonction permet de répéter jusqu'à ce que toutes les images ont été chargées.
J'ai cherché sur google des échantillons, mais n'a pas l'air d'en trouver un qui convient à mes codes. Quelqu'un pourrait-il svp me guider comment c'est fait? Je suis actuellement à l'aide imageloader Lazylist pour mes images. Je suis aussi à l'aide de AsyncTask.
MainGridView.class
public class MainGridView extends SherlockActivity {
private ProgressDialog pDialog;
ArrayList<HashMap<String, String>> songsList;
static final String KEY_SONG = "song";
static final String KEY_ID = "id";
static final String KEY_TITLE = "title";
static final String KEY_ARTIST = "artist";
static final String KEY_CAT_ARTIST = "artistcat";
static final String KEY_DURATION = "duration";
static final String KEY_THUMB_URL = "thumb_url";
static final String KEY_BIG_URL = "big_url";
static final String KEY_CAT_URL = "cat_url";
static String IMAGE_POSITION;
GridView grid;
MainGridViewLazyAdapter adapter;
String cat_url;
String artist_url;
private int visibleThreshold = 5;
private int currentPage = 0;
private int previousTotal = 0;
private boolean loading = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gridview_main);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
checkInternetConnection();
grid = (GridView) findViewById(R.id.grid_view);
grid.setOnScrollListener(new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//TODO Auto-generated method stub
if (loading) {
if (visibleItemCount > totalItemCount) {
loading = false;
previousTotal = totalItemCount;
currentPage++;
}
}
if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
//I load the next page of gigs using a background task,
//but you can call any function here.
new loadGridView().execute(currentPage + 1);
loading = true;
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//TODO Auto-generated method stub
}
});
}
public class loadGridView extends AsyncTask<Integer, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainGridView.this);
pDialog.setTitle("Connect to Server");
pDialog.setMessage("This process can take a few seconds to a few minutes, depending on your Internet Connection Speed.");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected String doInBackground(Integer... args) {
//updating UI from Background Thread
Intent in = getIntent();
songsList = new ArrayList<HashMap<String, String>>();
cat_url = in.getStringExtra(KEY_CAT_URL);
artist_url = in.getStringExtra(KEY_CAT_ARTIST);
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(cat_url); //getting XML from URL
Document doc = parser.getDomElement(xml); //getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_SONG);
//looping through all song nodes <song>
for (int i = 0; i < nl.getLength(); i++) {
//creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
//adding each child node to HashMap key => value
map.put(KEY_ID, parser.getValue(e, KEY_ID));
map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));
map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
map.put(KEY_BIG_URL, parser.getValue(e, KEY_BIG_URL));
//adding HashList to ArrayList
songsList.add(map);
}
return null;
}
@Override
protected void onPostExecute(String args) {
ActionBar ab = getSupportActionBar();
ab.setTitle(artist_url);
adapter=new MainGridViewLazyAdapter(MainGridView.this, songsList);
grid.setAdapter(adapter);
pDialog.dismiss();
}
}
OriginalL'auteur KC Chai | 2012-08-29
Vous devez vous connecter pour publier un commentaire.
je suppose que vous voulez charger les images à partir d'Url. Pour cela, vous pouvez utiliser cette solution: Chargement différé des images dans la ListViewAfin de contrôler l'échange à l'aide de
onScrollListener
, je pense que vous voulez voir la Infini défilement exemple. C'est un exemple simpliste, mais la seule chose que vous avez à ajouter est de vérifier si vous avez atteint le dernier élément de votre xml.À l'intérieur de votre
AsyncTask
(appelé à chaque nouveau chargement de), vous devez analyser uniquement les fichiers d'un bit de données à partir de votre xml (correspondant à 20 éléments dans votre cas). Ceci est un exemple d'utilisation sur la base de votre code:Pour des raisons de commodité, j'ai utilisé les textes au lieu de les images à l'intérieur de la
GridView
. Je me suis concentré sur le système de pagination donc je n'ai pas d'analyser le langage XML, juste ajouté quelques valeurs aléatoires à la volée.Aussi, vous pouvez envisager d'utiliser la même
addItemsAsyncTask
pour télécharger une partie seulement (20 éléments) de votre xml à chaque chargement au lieu de télécharger l'ensemble de+ de 1000 articles avant de créer leGridView
.Oh désolé, je vois alors, votre question est plus au sujet de faire une sorte de pagination pour le téléchargement xml, à l'aide des onScrollListener. Je vais modifier ma réponse bientôt.
Michel, Pourriez-vous svp me guider sur ce point?
J'ai eu cette idée. Puis-je limiter ma xml à 20 éléments pour la première fois de la charge . Puis onscroll vers le bas, de télécharger un autre 20 pièces à partir de xml. Répétez jusqu'à ce que le xml est vide.
Oui, c'est l'idée. Toutefois, si vous avez encore besoin d'aide à propos de la pagination de lui-même, je suis en train d'écrire un peu de code pour montrer le mécanisme, parce que la tâche vous appelez à chaque chargement de ne pas ajouter de 20 articles, mais de recharger l'ensemble de la gridview..
OriginalL'auteur Michel-F. Portzert