0

Gridview OnscrollListener を適切に動作させるには助けが必要です。私の結果は意図したとおりに機能していません。すべてのグリッドビュー項目をロードするだけで、グリッドビューを一番下までスクロールすると、進行状況ダイアログが表示されて更新されます。

OnScrollListener() のロジックを理解していないことは認めます。ここで与えられたこの例を参照していますAndroidのエンドレススクロールListView。うまくいけば、誰かが私のためにコードを編集できますか?

xml からすべての画像の読み込みが完了するまで、スクロールごとに 20 枚の画像を制限したいと考えています。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();
                }
            }
4

2 に答える 2

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;
        }
于 2012-09-07T08:58:40.840 に答える
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);

または、ページ * 制限行でヌル ポインター例外が発生します。

于 2012-09-01T22:12:02.417 に答える