android notifyDataSetChanged()删除列表中的原始数据



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

这就是我的代码看起来像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个列表中,适配器使用这些列表来填充每个列表项目,最后我通知适配器。

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

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

有什么想法吗?

[EDIT]添加将适配器设置到listview 的代码

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

回答我自己的问题。

事实证明,问题是我不了解notifyDataSetChanged()的作用。它调用使用与最初创建时相同的构造函数参数重新创建的适配器。因此,我将新项目添加到适配器内部列表中没有任何效果。相反,我需要确保通过其构造函数解析到适配器的列表包含所有项。

因此,尽管我之前的方法确实获取了适配器的内部列表以包含新数据和旧数据,但适配器的totalItemCount没有更新。

相关内容

最新更新