1

現在、 https: //github.com/thest1/LazyList で Android の Lazylist を使用して、リストビューに画像をロードしています。

私が直面した問題は、読み込まれた画像とデータが最初の 2 ページで正しいことです。3 ページ目に到達すると、ロードされたデータと画像は最初のページと同じになり、その後のページでも問題が続きます。

例:ページ1

ここに画像の説明を入力

そして3ページ目に到達すると、

ここに画像の説明を入力

日付を見て、画像がロードされました。それは同じだ。データは Web サイトから取得され、Web ブラウザーで表示すると、Web サイトは適切にデータを送信しています。

ロードされたデータが繰り返される理由は何ですか?

主な活動

public class MainActivity extends Activity {
    XMLParser parser;
    Document doc;
    String xml;
    ListView lv;
    ListViewAdapter adapter;
    ArrayList<HashMap<String, String>> menuItems;
    ProgressDialog pDialog;
    int limit = 8;
    boolean loadingMore = false;

    String URL = "http://test.com/5.php";

    // Flag for current page
    int current_page = 1;

    @Override
    public void onPause() {
        super.onPause();
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {

        lv = (ListView) findViewById(R.id.list);

        menuItems = new ArrayList<HashMap<String, String>>();
        parser = new XMLParser();
        new firstLoad().execute();

        // Getting adapter
        adapter = new ListViewAdapter(this, menuItems);
        lv.setAdapter(adapter);

        lv.setOnScrollListener(new OnScrollListener() {

            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }

            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {

                int lastInScreen = firstVisibleItem + visibleItemCount;
                if ((lastInScreen == totalItemCount) && !(loadingMore)) {
                    new loadMoreListView().execute();
                }
            }
        });

    
    /**
     * Async Task that send a request to url Gets new list view data Appends to
     * list view
     * */
    private class loadMoreListView extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            // Showing progress dialog before sending http request
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please wait..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        protected Void doInBackground(Void... unused) {
            loadingMore = true;
            // increment current page
            current_page += 1;

            // Next page request
            URL = URL + "?page=" + current_page;

            xml = parser.getXmlFromUrl(URL); // getting XML
            doc = parser.getDomElement(xml); // getting DOM element

            NodeList nl = doc.getElementsByTagName(KEY_ITEM);
            // looping through all item nodes <item>
            for (int i = 0; i < nl.getLength(); 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_NAME, parser.getValue(e, KEY_NAME));
                map.put(KEY_IMG, parser.getValue(e, KEY_IMG));
                map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
                map.put(KEY_WEBSITEURL, parser.getValue(e, KEY_WEBSITEURL));
                map.put(KEY_IMAGEURL, parser.getValue(e, KEY_IMAGEURL));
                // adding HashList to ArrayList
                menuItems.add(map);
            }

            return (null);
        }

        protected void onPostExecute(Void unused) {
            // closing progress dialog
            runOnUiThread(new Runnable() {
                public void run() {
                    // add things to do here
                    pDialog.dismiss();

                    // get listview current position - used to maintain scroll
                    // position
                    int currentPosition = lv.getFirstVisiblePosition();
                    Toast.makeText(getApplicationContext(), "Current on page " + String.valueOf(current_page), Toast.LENGTH_SHORT).show();
                    // Appending new data to menuItems ArrayList
                    adapter = new ListViewAdapter(MainActivity.this, menuItems);
                    lv.setAdapter(adapter);

                    // Setting new scroll position
                    lv.setSelectionFromTop(currentPosition + 1, 0);
                    loadingMore = false;
                }
            });

        }
    }

    private class firstLoad extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            // Showing progress dialog before sending http request
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Loading..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        protected Void doInBackground(Void... unused) {
            loadingMore = true;
            xml = parser.getXmlFromUrl(URL); // getting XML
            doc = parser.getDomElement(xml); // getting DOM element

            NodeList nl = doc.getElementsByTagName(KEY_ITEM);
            // looping through all item nodes <item>
            for (int i = 0; i < nl.getLength(); 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_NAME, parser.getValue(e, KEY_NAME));
                map.put(KEY_IMG, parser.getValue(e, KEY_IMG));
                map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
                map.put(KEY_WEBSITEURL, parser.getValue(e, KEY_WEBSITEURL));
                map.put(KEY_IMAGEURL, parser.getValue(e, KEY_IMAGEURL));
                // adding HashList to ArrayList
                menuItems.add(map);
            }

            // Appending new data to menuItems ArrayList

            return (null);
        }

        protected void onPostExecute(Void unused) {
            // closing progress dialog

            runOnUiThread(new Runnable() {
                public void run() {
                    loadingMore = false;
                    // add things to do here
                    pDialog.dismiss();
                    adapter = new ListViewAdapter(MainActivity.this, menuItems);
                    lv.setAdapter(adapter);
                }
            });

        }
    }
}

最後の質問 :

データが再度ロードされるのを防ぐために、リストビューの状態を保存するコードはありますか? ユーザーがこのアプリを終了するために何度も押し戻し、再度開くと、データはページ 1 から読み込まれます。状態を保存して、ユーザーが以前に中断したところから開くコードはありますか?

ありがとう!

4

0 に答える 0