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

时间:2012-03-20 15:57:29

标签: android listview baseadapter android-lazyadapter

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

这就是我的代码看起来像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来获取更多视频。在asynctask中,我将适配器设置为一个在asynctask完成后触发的事件的监听器 - 这是有效的。

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

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

忘记添加我已经确认列表的长度确实增加了,这意味着它确实包含原始数据和新添加的

有什么想法吗?

[编辑]添加我将适配器设置到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);

1 个答案:

答案 0 :(得分:1)

回答我自己的问题。

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

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