I need help to make my Gridview OnscrollListener to work properly. My outcome is not functioning as intended. It just loads all my gridview items, then when I scroll the gridview to the bottom it shows a progress dialog and refreshes.
I do admit that I do not understand the logic in OnScrollListener(). I’m referring to this example given here Endless Scrolling ListView in Android . Hopefully someone could edit the codes for me?
I would like to limit 20 images per scroll until it finishes to load all my images from my xml. I’m parsing urls from xml, then it loads into my Gridview.
GridViewActivity.class
public class GridViewActivity extends Activity {
static final String URL = "http://api.androidhive.info/music/music.xml";
private ProgressDialog pDialog;
ArrayList<HashMap<String, String>> songsList;
static final String KEY_SONG = "song";
static final String KEY_ID = "id";
static final String KEY_CAT_ARTIST = "artistcat";
static final String KEY_THUMB_URL = "thumb_url";
static final String KEY_BIG_URL = "big_url";
static final String KEY_CAT_URL = "cat_url";
GridView grid;
GridViewActivityLazyAdapter 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);
new loadGridView().execute();
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 (totalItemCount > previousTotal) {
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 + 20);
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(GridViewActivity.this);
pDialog.setTitle("Connect to Server");
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(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>
int page = args[0];
int limit = 20; // items per page
int istart = page * limit; // what item to start on (onCreate() calls it with 0 and 0 * 20 = 0)
int iend = istart + limit; // how far to go
for (int i = istart; (i < nl.getLength()) && (i < iend); 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_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) {
adapter=new GridViewActivityLazyAdapter(GridViewActivity.this, songsList);
grid.setAdapter(adapter);
pDialog.dismiss();
}
}
Change this line
to this
and in onCreate() change
to
or you will get a null pointer exception on the page * limit line;