【问题标题】:android notifyDataSetChanged() deletes original data in the listandroid notifyDataSetChanged() 删除列表中的原始数据
【发布时间】:2012-03-20 15:57:29
【问题描述】:

当用户滚动到列表底部时,我正在尝试将项目添加到适配器。我能够做到这一点,但是我想将新项目添加到适配器并保留已经存在的项目,但现在原始项目已被删除,只有新项目可见。关于如何实现这一目标的任何想法?

这就是我的代码在 atm 的样子:

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

        if (loading) {      
            if (totalItemCount > previousTotal) {
                previousTotal = totalItemCount;
                loading = false;
                previousTotal = totalItemCount;
                currentPage++;
            }
        }
        if (!loading
                && ((firstVisibleItem + visibleItemCount) >= totalItemCount)) {
            if (fragmentMode == 5) {
                ActiveUser.getInstance().FetchVidPage(currentPage, chanID,
                        activity, this);
                loading = true;
            }
        }
}

@Override
public void onTaskFinished() {
    titles.addAll(ActiveUser.getInstance().getWebVidInfo(1));
    thumbs.addAll(ActiveUser.getInstance().getWebVidInfo(2));
    data.addAll(ActiveUser.getInstance().getWebVidInfo(3));
    describtions.addAll(ActiveUser.getInstance().getWebVidInfo(4));
    vidOwnerIDs.addAll(ActiveUser.getInstance().getWebVidInfo(4));

    notifyDataSetChanged();

}

只是为了澄清我在做什么;一旦列表的底部可见,我就会启动一个获取更多视频的 AsyncTask。在异步任务中,我将适配器设置为异步任务完成后触发的事件的侦听器 - 这有效。

onTaskFinished() 上面最后一个方法 - 这里我将新项目添加到 4 个列表中,适配器使用这些列表来填写每个列表项,最后我通知适配器。

所以新项目都添加得很好,问题是在添加新项目之前的项目,由于某种原因被删除,或者不再可见。

忘了补充一下,我已经验证列表的长度确实增加了,这意味着它确实包含原始数据和新添加的数据

有什么想法吗?

[编辑] 添加我将适配器设置到列表视图的代码

        adapter = new LazyAdapter(getActivity(), ActiveUser.getInstance()
                .getWebVidInfo(3),
                ActiveUser.getInstance().getWebVidInfo(1), ActiveUser.getInstance()
                        .getWebVidInfo(2),
                ActiveUser.getInstance().getWebVidInfo(5), ActiveUser.getInstance()
                        .getWebVidInfo(4), CHAN_ID, FRAGMENT_MODE);
        listing.setAdapter(adapter);
        listing.setOnScrollListener(adapter);

【问题讨论】:

  • 如果您的适配器没有更新它从 getCount 返回的值,这可能会发生。有这种可能吗?
  • @PhillipFitzsimmons 它从 getCount 获得的值是名为“titles”的列表的长度,所以不要认为这是问题。
  • 将适配器设置为 listview 时的邮政编码,以及自定义适配器的签名...
  • @Rahulgarg 添加了我设置适配器时的代码,不确定您所说的签名是什么意思-您能详细说明吗?
  • 我的意思是构造函数......没关系,顺便说一句......你是否直接在 getView() 中访问标题、拇指等?您的问题似乎很奇怪...请再次检查...:新列表是否包含(所有旧值+新值)?并且视图只显示 值而不是旧值?。

标签: android listview baseadapter android-lazyadapter


【解决方案1】:

回答我自己的问题。

原来问题是我对 notifyDataSetChanged() 的作用缺乏了解。它使用与最初创建时相同的构造函数参数调用正在重新创建的适配器。所以我将新项目添加到适配器内部列表没有任何效果。相反,我需要确保通过其构造函数解析到适配器的列表包含所有项目。

因此,虽然我之前的方法确实让适配器的内部列表包含新旧数据,但适配器的 totalItemCount 并未更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多