android - ListView 自定义适配器 - 何时调用 notifyDataSetChanged?

标签 android listview android-listview

我在 Stckoverflow 上阅读了很多问题和答案。但是仍然找不到我什么时候真正使用 adapter.notifyDataSetChanged

以前,在将所有项目添加到 ArrayList 之后,我做了

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

它在我的手机、模拟器上完全没有崩溃,只有少数人发生了崩溃。

然后,我做到了。

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

结果同上。

但我讨厌崩溃。我讨厌下载我的应用程序的人有 FC。 然后我尝试了这个,知道适配器可能需要刷新,然后我可以设置一个新的。

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

结果是,在向下滚动几页后 [永无止境的 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();
                            }
                        }
                    });

            }
        });

    }
}`

提前致谢。

最佳答案

But when do we ACTUALLY use adapter.notifyDataSetChanged?

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

的调用

关于android - ListView 自定义适配器 - 何时调用 notifyDataSetChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16503955/

相关文章:

android - 使类可打包错误

android - 如果向下滚动列表,则在使用 ViewHolder 时应用程序崩溃

android - UIL,Picasso - 适配器中的图像总是在停止滚动时重新加载

android - 将 ListView 项目放在可见区域的中心

android - react native Apollo 错误 : "Network error: Network request failed"

Android SlidingDrawer 处理程序的图像

android - 从 Android 的 .NET WebService 中保存字节

java - 从 CustomListAdapter 问题中的 SharedPreferences 中删除值

android - 在带有边距的布局中使用带有标题的 ListView

android - 在 Android 中删除 ListView 项目