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);

结果是,在向下滚动几页 [never-ending listview] 后,它在我的手机上崩溃了。

也许是我不明白。但是我们什么时候真正使用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

5

但是我们什么时候真正使用adapter.notifyDataSetChanged?

当您的数据发生变化时使用此方法。例如从您的Array或您的适配器获取数据的任何地方添加或删除项目。创建时,Adapter您不需要/不想调用它,因为数据尚未更改,会给您带来麻烦。因此,您只想在添加/删除/修改数据并且您没有进行任何其他会重绘ListView

于 2013-05-12T03:50:23.230 回答
1

设置适配器时,不必显式调用 adapter.notifyDataSetChanged()。它自己做。您唯一需要调用的地方是数据实际更改但您的适配器没有更改时。

希望这可以帮助。

于 2013-05-12T03:47:20.737 回答
0

尝试使用 TabHost 机智片段,并在 Buttons 的位置使用选项卡。它可能会解决你的问题。

于 2014-08-11T12:53:53.960 回答