Представление не обновляется после вызова myAdapter.notifyDataSetChanged - PullRequest
0 голосов
/ 20 июня 2019

У меня есть приложение, которое загружает файлы с другого устройства.

Эти файлы отображаются в Listview, и я использую специальный адаптер для отображения CheckBox и TextView для каждого элемента списка.

Когда запускается мой 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 голосов
/ 20 июня 2019

Основная проблема, которую я вижу, заключается в том, что вы не обновляете список внутри Адаптера.Таким образом, у вашего адаптера всегда будет отображаться один и тот же набор данных ...

// 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;
}

Примечание. Вместо обновления всего списка вАдаптер, вы можете создать метод и просто добавить новый элемент (вместо замены всего списка).В любом случае, я просто попытался указать вам на проблемную точку!

Надеюсь, что смогу помочь

...