调用myAdapter.notifyDataSetChanged后视图未更新

时间:2019-06-19 21:30:55

标签: android android-arrayadapter

我有一个可以从另一台设备下载文件的应用程序。

这些文件显示在Listview中,我使用自定义适配器为列表的每个项目显示CheckBoxTextView

DownloadActivity启动时,我检查存储目录并显示Listview中当前存在的所有文件。一切正常。

我可以删除文件,它们消失了。

但是,当我下载新文件时,也会尝试更新ArrayList和适配器。但是,这不起作用。

我正在调用notifyDataSetChenged(),但没有运气。

我认为应该刷新视图并添加文件。我没有错。只是列表中未显示的文件。

如果我关闭应用程序并重新启动,则在启动DownloadActivity时将显示文件。

到目前为止,这是我的代码:

public void saveFile(String curSurvey, String curFilename) {
    if (externalDir == null) {
        Toast.makeText(getApplicationContext(),
                "Sorry! Failed to save survey. No Directories", Toast.LENGTH_SHORT)
                .show();
    } else if (curSurvey.length() > 0 && curFilename.length() > 0) {
        FileReadWriteWrapper frww = new FileReadWriteWrapper();
        frww.openOutputWriter(curFilename, externalDir, "/surveys");
        frww.writeToFile(curSurvey);
        frww.closeIOStream();

        if (arrayList == null) {
            arrayList = new ArrayList<>();
        }

        arrayList.add(new FileListItem(false,curFilename + " " + curSurvey.length() + " Bytes" ));                                                                                                                                                                            ;

        if (surveyFileListAdapter == null) {
            surveyFileListAdapter = new SurveyFileListAdapter(arrayList,this);
            surveyListview.setAdapter(surveyFileListAdapter);

        }
        surveyFileListAdapter.notifyDataSetChanged();
    }
}

1 个答案:

答案 0 :(得分:0)

我看到的主要问题是您没有更新适配器内的列表。这样,您的适配器始终具有相同的要显示的数据集...

// Here is your problem.. You are updating the List in the Activity/Fragment
// However, you must update the list inside the adapter.
// Otherwise, the adapter will always display the same items.
arrayList.add(new FileListItem(false,curFilename + " " + curSurvey.length() + " Bytes" ));                                                                                                                                                                            ;

if (surveyFileListAdapter == null) {
    surveyFileListAdapter = new SurveyFileListAdapter(arrayList,this);
    surveyListview.setAdapter(surveyFileListAdapter);
} else {
    // Add this else statement..
    // This way, if the adapter was already created, you just update its list
    // and call notifyDataSetChanged to refresh the screen
    surveyFileListAdapter.updateList(arrayList);
    surveyFileListAdapter.notifyDataSetChanged();
}

然后,您的适配器:

public void updateList(ArrayList<FileListItem> arrayList) {
    mArrayList = arrayList;
}

注意:您可以创建一个方法并仅添加新项(而不是替换整个列表),而不是在适配器中更新整个列表。无论如何,我只是想指出有问题的地方给你!

希望我能帮忙