#android #bundle
#Android #пакет
Вопрос:
Я играл с Bundle.putStringArrayList
ArrayList<String> myArrayList = new ArrayList<String>();
ArrayList<String> keys = new ArrayList<String>();
Bundle name_bundle = new Bundle();
for (int i = 0; 10 > i; i ){
myArrayList.add(i " first");
myArrayList.add(i " second");
keys.add(i " key");
name_bundle.putStringArrayList(keys.get(i), myArrayList);
myArrayList.clear();
}
Я бы ожидал, что результат (при отладке) будет (после запуска цикла пару раз, но не до завершения):
Bundle[{2 ключа = [2 первых, 2 вторых], 1 ключ = [1 первый, 1 второй], 0 ключ = [0 первый, 0 второй]}]
Тем не менее, это:
Bundle[{2 ключа = [2 первых, 2 вторых], 1 ключ = [2 первых, 2 вторых], 0 ключей = [2 первых, 2 вторых]}]
Это ошибка, или так оно и должно работать? И если да, то это потому, что он повторно использует один и тот же массив?
Поскольку ключ всегда разный, я не уверен, почему он перезаписывает каждое значение.
Тем более, что это:
ArrayList<String> keys = new ArrayList<String>();
Bundle name_bundle = new Bundle();
for (int i = 0; 10 > i; i ){
keys.add(i " key");
String s = i " string";
name_bundle.putString(keys.get(i), s);
}
Выдает это (после запуска цикла пару раз):
Bundle[{2 ключа = 2 строки, 1 ключ = 1 строка, 3 ключа = 3 строки, 0 ключей = 0 строк}]
ОТРЕДАКТИРОВАНО
При использовании следующего:
ArrayList<String> one = new ArrayList<String>();
ArrayList<String> two = new ArrayList<String>();
ArrayList<String> tmpkey = new ArrayList<String>();
one.add("1 first array");
one.add("2 first array");
two.add("1 second array");
two.add("2 second array");
tmpkey.add("first key");
tmpkey.add("second key");
name_bundle.putStringArrayList(tmpkey.get(0), one);
name_bundle.putStringArrayList(tmpkey.get(1), two);
Вы получаете:
Bundle[{первый ключ = [1 первый массив, 2 первых массива], второй ключ = [1 второй массив, 2 вторых массива]}]
Однако тот факт, что для этого требуются новые списки массивов, сводит на нет цель повторного использования списка массивов с помощью .clear() .
Просто для проверки, при добавлении следующего в конец приведенного выше:
one.clear();
one.add("will it work?");
name_bundle.putStringArrayList(tmpkey.get(2), one);
Вы получаете:
Bundle[{третий ключ = [будет ли это работать?], первый ключ = [будет ли это работать?], второй ключ = [1 второй массив, 2 вторых массива]}]
Кто-нибудь знает об обходном пути, при котором я могу повторно использовать arraylist, чтобы я мог использовать его в цикле? Или, возможно, другой подход все вместе? Причина, по которой я пошел на цикл, заключается в том, что я не знал, сколько раз мне придется повторно использовать arraylist, или, поскольку это не позволяет вам, сколько arraylists мне понадобится.
Комментарии:
1. Для первого набора кода при перемещении ArrayList<String> myArrayList = new ArrayList<String>(); внутри цикла for вы получаете: Bundle[{2 ключа = [2 первых, 2 вторых], 1 ключ = [], 0 ключ = []}] Просто обновляясь, когда я его тестирую…
Ответ №1:
Вы вызываете #clear()
свой myArrayList
и повторно используете его, в результате чего все ключи ссылаются на один и тот же список (до тех пор, пока / если они не будут разделены, я думаю). Попробуйте выделить новое ArrayList
для каждого вызова #putStringArrayList(...)
.
Комментарии:
1. Принял ваше предложение и обновил вышеприведенный пост. В принципе, для этого требуется новый arraylist — даже если предыдущий уже был очищен. Есть ли способ вручную уничтожить и воссоздать arraylist? Или какой-то другой подход?
2. Правильный способ — создать новый ArrayList для каждого ключа, поскольку класс Bundle не выполняет (потенциально бессмысленную) копию передаваемого вами параметра.
3. У меня создалось впечатление, что он выполнял копии (так как при изменении строки новый ключ / строковое значение не будет перезаписывать предыдущие). Похоже, мне придется использовать другой подход. Спасибо.