我需要帮助才能使我的Gridview OnscrollListener正常工作。我的结果没有达到预期的效果。它只是加载我的所有gridview项目,然后当我将gridview滚动到底部时,它会显示一个进度对话框并刷新。
我承认我不理解OnScrollListener()中的逻辑。我指的是这里给出的这个例子Endless Scrolling ListView in Android。希望有人可以为我编辑代码?
我想限制每个滚动20个图像,直到它完成从我的xml加载我的所有图像。我正在从xml解析url,然后它加载到我的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();
}
}
答案 0 :(得分:0)
更改此行
for (int i = 0; i < nl.getLength(); i++) {
到这个
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++) {
并在 onCreate()更改
new loadGridView().execute();
到
new loadGridView().execute(0);
或者您将在页面*限制线上获得空指针异常;
答案 1 :(得分:0)
您发送到loadGridView“currentPage + 20”,然后将其乘以limit,即20,所以这是一个巨大的数字。你说那个
for (int i = istart; (i < nl.getLength()) && (i < iend); i++)
// for (int i = hugeNumber; (i<probablyLessNumber) && (i < iend); i++)
所以它甚至可能不会进入这个声明...... 我假设你应该这样做:
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;
}