Gridview OnScrollListener无法正常工作

时间:2012-08-29 15:08:05

标签: android gridview

我需要帮助才能使我的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();
                }
            }

2 个答案:

答案 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;
        }