In the onCreate() method, I call it Asynctask :
private class getAlbumsData extends AsyncTask<Void, Void, Void> { LinearLayout linlaHeaderProgress = (LinearLayout) findViewById(R.id.linlaHeaderProgress); @Override protected void onPreExecute() { // SHOW THE PROGRESS BAR (SPINNER) WHILE LOADING ALBUMS linlaHeaderProgress.setVisibility(View.VISIBLE); } @Override protected Void doInBackground(Void... params) { // CHANGE THE LOADING MORE STATUS TO PREVENT DUPLICATE CALLS FOR // MORE DATA WHILE LOADING A BATCH loadingMore = true; // SET THE INITIAL URL TO GET THE FIRST LOT OF ALBUMS URL = "https://graph.facebook.com/" + initialUserID + "/albums&access_token=" + Utility.mFacebook.getAccessToken() + "?limit=10"; try { HttpClient hc = new DefaultHttpClient(); HttpGet get = new HttpGet(URL); HttpResponse rp = hc.execute(get); if (rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { String queryAlbums = EntityUtils.toString(rp.getEntity()); JSONObject JOTemp = new JSONObject(queryAlbums); JSONArray JAAlbums = JOTemp.getJSONArray("data"); if (JAAlbums.length() == 0) { stopLoadingData = true; Runnable run = new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "No more Albums", Toast.LENGTH_SHORT) .show(); } }; Albums.this.runOnUiThread(run); } else { // PAGING JSONOBJECT if (JOTemp.has("paging")) { JSONObject JOPaging = JOTemp.getJSONObject("paging"); if (JOPaging.has("next")) { String initialpagingURL = JOPaging .getString("next"); String[] parts = initialpagingURL.split("limit=10"); String getLimit = parts[1]; pagingURL = "https://graph.facebook.com/" + initialUserID + "/albums&access_token=" + Utility.mFacebook.getAccessToken() + "?limit=10" + getLimit; } else { stopLoadingData = true; Runnable run = new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "No more Albums", Toast.LENGTH_SHORT).show(); } }; Albums.this.runOnUiThread(run); } } else { stopLoadingData = true; Runnable run = new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "No more Albums", Toast.LENGTH_SHORT).show(); } }; Albums.this.runOnUiThread(run); } getAlbums albums; for (int i = 0; i < JAAlbums.length(); i++) { JSONObject JOAlbums = JAAlbums.getJSONObject(i); if (JOAlbums.has("link")) { albums = new getAlbums(); // GET THE ALBUM ID if (JOAlbums.has("id")) { albums.setAlbumID(JOAlbums.getString("id")); } else { albums.setAlbumID(null); } // GET THE ALBUM NAME if (JOAlbums.has("name")) { albums.setAlbumName(JOAlbums .getString("name")); } else { albums.setAlbumName(null); } // GET THE ALBUM COVER PHOTO if (JOAlbums.has("cover_photo")) { albums.setAlbumCover("https://graph.facebook.com/" + JOAlbums.getString("cover_photo") + "/picture?type=normal" + "&access_token=" + Utility.mFacebook .getAccessToken()); } else { albums.setAlbumCover("https://graph.facebook.com/" + JOAlbums.getString("id") + "/picture?type=album" + "&access_token=" + Utility.mFacebook .getAccessToken()); } // GET THE ALBUM PHOTO COUNT if (JOAlbums.has("count")) { albums.setAlbumPhotoCount(JOAlbums .getString("count")); } else { albums.setAlbumPhotoCount("0"); } arrAlbums.add(albums); } } } } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { // SET THE ADAPTER TO THE LISTVIEW lv.setAdapter(adapter); // CHANGE THE LOADING MORE STATUS loadingMore = false; // HIDE THE PROGRESS BAR (SPINNER) AFTER LOADING ALBUMS linlaHeaderProgress.setVisibility(View.GONE); } }
For completeness, here is what I use to get paging URLs for an infinite list:
private class loadMoreAlbums extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { // SHOW THE BOTTOM PROGRESS BAR (SPINNER) WHILE LOADING MORE ALBUMS linlaProgressBar.setVisibility(View.VISIBLE); } @Override protected Void doInBackground(Void... params) { // SET LOADING MORE "TRUE" loadingMore = true; // INCREMENT CURRENT PAGE current_page += 1; // Next page request URL = pagingURL; // Log.e("NEW URL", URL); try { HttpClient hc = new DefaultHttpClient(); HttpGet get = new HttpGet(URL); HttpResponse rp = hc.execute(get); if (rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { String queryAlbums = EntityUtils.toString(rp.getEntity()); // Log.e("RESULT", queryAlbums); JSONObject JOTemp = new JSONObject(queryAlbums); JSONArray JAAlbums = JOTemp.getJSONArray("data"); if (JAAlbums.length() == 0) { stopLoadingData = true; Runnable run = new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "No more Albums", Toast.LENGTH_SHORT) .show(); } }; Albums.this.runOnUiThread(run); } else { // PAGING JSONOBJECT JSONObject JOPaging = JOTemp.getJSONObject("paging"); // Log.e("PAGING", JOPaging.toString()); if (JOPaging.has("next")) { String initialpagingURL = JOPaging .getString("next"); // Log.e("initialpagingURL", initialpagingURL); String[] parts = initialpagingURL.split("limit=10"); String getLimit = parts[1]; pagingURL = "https://graph.facebook.com/" + initialUserID + "/albums&access_token=" + Utility.mFacebook.getAccessToken() + "?limit=10" + getLimit; // Log.e("NEW PAGING URL", pagingURL); } else { stopLoadingData = true; Runnable run = new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "No more Albums available", Toast.LENGTH_SHORT).show(); } }; Albums.this.runOnUiThread(run); } getAlbums albums; for (int i = 0; i < JAAlbums.length(); i++) { JSONObject JOAlbums = JAAlbums.getJSONObject(i); // Log.e("INDIVIDUAL ALBUMS", JOAlbums.toString()); if (JOAlbums.has("link")) { albums = new getAlbums(); // GET THE ALBUM ID if (JOAlbums.has("id")) { albums.setAlbumID(JOAlbums.getString("id")); } else { albums.setAlbumID(null); } // GET THE ALBUM NAME if (JOAlbums.has("name")) { albums.setAlbumName(JOAlbums .getString("name")); } else { albums.setAlbumName(null); } // GET THE ALBUM COVER PHOTO if (JOAlbums.has("cover_photo")) { albums.setAlbumCover("https://graph.facebook.com/" + JOAlbums.getString("cover_photo") + "/picture?type=album" + "&access_token=" + Utility.mFacebook .getAccessToken()); } else { albums.setAlbumCover("https://graph.facebook.com/" + JOAlbums.getString("id") + "/picture?type=album" + "&access_token=" + Utility.mFacebook .getAccessToken()); } // GET THE ALBUM PHOTO COUNT if (JOAlbums.has("count")) { albums.setAlbumPhotoCount(JOAlbums .getString("count")); } else { albums.setAlbumPhotoCount("0"); } arrAlbums.add(albums); } } } } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { // get listview current position - used to maintain scroll position int currentPosition = lv.getFirstVisiblePosition(); // APPEND NEW DATA TO THE ARRAYLIST AND SET THE ADAPTER TO THE // LISTVIEW adapter = new AlbumsAdapter(Albums.this, arrAlbums); lv.setAdapter(adapter); // Setting new scroll position lv.setSelectionFromTop(currentPosition + 1, 0); // SET LOADINGMORE "FALSE" AFTER ADDING NEW FEEDS TO THE EXISTING // LIST loadingMore = false; // HIDE THE BOTTOM PROGRESS BAR (SPINNER) AFTER LOADING MORE ALBUMS linlaProgressBar.setVisibility(View.GONE); } }
loadMoreAlbums Asynctask launched from onScrollListener in onCreate() :
lv.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int lastInScreen = firstVisibleItem + visibleItemCount; if ((lastInScreen == totalItemCount) && !(loadingMore)) { if (stopLoadingData == false) {
You can select the appropriate parts from my code, or you can use it in its entirety (after filling in a few spaces, of course). Hope this helps.