2

Stckoverflow でたくさんの質問と回答を読んできました。しかし、実際にいつ使用するのかはまだわかりませんadapter.notifyDataSetChanged

以前は、すべてのアイテムを ArrayList に追加した後、

adapter = new ListViewAdapter(MainActivity.this, menuItems); lv.setAdapter(adapter); adapter.notifyDataSetChanged();

私の電話、エミュレーターではまったくクラッシュしませんでした。このクラッシュが発生したのはごく少数でした。

それから、私はしました。

adapter = new ListViewAdapter(MainActivity.this, menuItems); adapter.notifyDataSetChanged(); lv.setAdapter(adapter);

上記と同じ結果です。

でもクラッシュは嫌い。私のアプリをダウンロードする人が FC を持っているのが嫌いです。そして、おそらくアダプターを更新する必要があることを知って、これを試しました。その後、新しいアダプターを設定できます。

adapter.notifyDataSetChanged(); adapter = new ListViewAdapter(MainActivity.this, menuItems); lv.setAdapter(adapter);

その結果、いくつかのページを下にスクロールした後 [終わりのないリストビュー]、私の電話でクラッシュします。

わからないのは私かもしれません。しかし、実際にいつ使用するのadapter.notifyDataSetChangedでしょうか?

それが役立つ場合、これは私の完全なコードです。

`

private class firstLoad extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            setSupportProgressBarIndeterminateVisibility(true);
            if (lv.getVisibility() == View.VISIBLE) {
                lv.setVisibility(View.GONE);
            }
        }

    protected Void doInBackground(Void... unused) {
        try {
                xml = parser.getXmlFromUrl(getURLFromXML + "main.php");
            doc = parser.getDomElement(xml);
            NodeList nl = doc.getElementsByTagName(Consts.KEY_ITEM);
            for (int i = 0; i < nl.getLength(); i++) {
                HashMap<String, String> map = new HashMap<String, String>();
                Element e = (Element) nl.item(i);
                map.put(Consts.KEY_NAME,
                        parser.getValue(e, Consts.KEY_NAME));
                map.put(Consts.KEY_DATE,
                        parser.getValue(e, Consts.KEY_DATE));
                menuItems.add(map);
            }
        } catch (Exception e) {
            Log.e(TAG, "Error loading first page", e);
        }
        return (null);
    }

    protected void onPostExecute(Void unused) {
        setSupportProgressBarIndeterminateVisibility(false);
        MainActivity.this.runOnUiThread(new Runnable() {
            public void run() {
                    //adapter.notifyDataSetChanged();
                    adapter = new ListViewAdapter(MainActivity.this,
                            menuItems);
                    lv.setAdapter(adapter);
                    lv.setVisibility(View.VISIBLE);
                    loadingMore = false;
                    lv.setSelectionFromTop(0, 0);
                    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();
                            }
                        }
                    });

            }
        });

    }
}`

前もって感謝します。

4

3 に答える 3

1

アダプターを設定するときに、adapter.notifyDataSetChanged() を明示的に呼び出す必要はありません。それはそれ自身でそれを行います。呼び出す必要がある唯一の場所は、データが実際に変更されたが、アダプターが変更されていない場合です。

お役に立てれば。

于 2013-05-12T03:47:20.737 に答える
0

TabHost ウィット フラグメントを使用し、ボタンの代わりにタブを使用してみてください。それはあなたの問題を解決するかもしれません。

于 2014-08-11T12:53:53.960 に答える