Элемент добавляется в мой arrayList в ArrayAdapter - PullRequest
0 голосов
/ 16 мая 2018

У меня есть список userSubs (к которому я получаю доступ с помощью dm.theUser.getAllSubmissions) элементов под названием Submission и черновик представления, который я называю tempSub, которого нет в этом списке. У меня есть представление списка, в котором я хочу отобразить все элементы в userSubs и tempSub.

Я создаю временный ArrayList с именем toDisplay, добавляю все элементы в userSubs и затем добавляю tempSub. Затем я передаю toDisplay в мой arrayAdapter. Это отлично работает. Но когда я нажимаю назад и страница перезагружается, мой tempSub каким-то образом добавляется в userSubs ... тщательный собственный поиск и поиск "find in path" показывают, что я никогда не вызываю функцию userSubs.add ().

ArrayList<Submission> toDisplay = new ArrayList<>();
toDisplay = dm.theUser.getAllSubmissions();
if(dm.tempSub.draftCreated) {
    toDisplay.add(dm.tempSub);
}
saa = new submissionArrayAdapter(userSubmissions.this, toDisplay.toArray(
            new Submission[toDisplay.size()]));

Вот часть кода адаптера массива.

private final Activity context;
private Submission[] submissions;
//constructor
public submissionArrayAdapter(Activity context, Submission[] submissions) {

    super(context, R.layout.user_submission_row, submissions);
    this.context = context;
    this.submissions = submissions;

}

Есть идеи о том, как tempSub добавляется в userSubs?

1 Ответ

0 голосов
/ 16 мая 2018

У меня есть список userSubs (к которым я обращаюсь dm.theUser.getAllSubmissions) элементов, называемых представлением и черновиком я вызываю tempSub, которого нет в этом списке.

Здесь я предполагаю, что вы имели в виду:

userSubs = dm.theUser.getAllSubmissions);

Я создаю временный массив файлов с именем toDisplay и добавляю все элементы в userSubs, а затем добавить tempSub.

Полагаю, вы указываете на это:

ArrayList<Submission> toDisplay = new ArrayList<>();
toDisplay = dm.theUser.getAllSubmissions();
if(dm.tempSub.draftCreated) {
    toDisplay.add(dm.tempSub);
}

Проблема с вашим кодом в том, что вы создаете новую переменную toDisplay с

ArrayList<Submission> toDisplay = new ArrayList<>();

но затем вы заменяете вновь созданный экземпляр на:

toDisplay = dm.theUser.getAllSubmissions();

Итак, ваш toDisplay больше не является новым экземпляром ArrayList. Это потому, что ваш toDisplay теперь ссылается на экземпляр, возвращаемый dm.theUser.getAllSubmissions();

При использовании следующего кода:

toDisplay = dm.theUser.getAllSubmissions();
if(dm.tempSub.draftCreated) {
    toDisplay.add(dm.tempSub);
}

вы добавляете элемент к экземпляру, указанному dm.theUser.getAllSubmissions().

Обратите внимание: , В Java объект передается по ссылке в методе, а метод возвращает ссылку на объект.

Что вам действительно нужно, так это скопировать список из dm.theUser.getAllSubmissions(); в toDisplay. Вы можете использовать мелкую копию с чем-то вроде этого:

List<Submission> oldSubmissions = dm.theUser.getAllSubmissions();
ArrayList<Submission> toDisplay = new ArrayList<>(oldSubmissions);

Для глубокого копирования, пожалуйста, прочитайте Как сделать глубокое копирование объекта в Java?

...