У меня есть ScrollView внутри моей деятельности, к которому Views
добавляются во время выполнения. По сути, когда игрок определяет свое имя и пол (а также имена и полы других игроков), а затем нажимает кнопку «плюс», три элемента добавляются в одну строку внутри ScrollView : одного ImageView для пола (который содержит мужской или женский значок), TextView для отображения имени игрока и кнопку удаления в конце строки, так что этот игрок может быть удаленным, например, если пользователь неправильно набрал имя игрока.
Если n
- это количество добавленных игроков (или число, на которое была нажата кнопка «плюс»), то количество просмотров внутри ScrollView равно n*3
.
После нажатия кнопки «плюс» для добавления игрока я также создаю экземпляр PlayerDraft , который содержит имя игрока, пол игрока и три целых числа, соответствующих представлениям, связанным с игроком. (один int для идентификатора соответствующего значка, один int для идентификатора соответствующего текстового представления, представляющего имя игрока, и один int для идентификатора кнопки удаления, связанной с игроком).
Я также отслеживаю между id
с кнопок удаления и этими PlayerDraft экземплярами в хэш-карте. Таким образом, когда нажимается определенная кнопка удаления, я могу использовать ее id
, чтобы найти соответствующий экземпляр PlayerDraft и, следовательно, также id
из View , связанных с этот плеер внутри ScrollView .
Это код, который вызывается каждый раз, когда нажимается определенная кнопка удаления (это в основном внутри метода, который я вызываю при каждой добавляемой кнопке удаления, чтобы установить его на экземпляре прослушивателя щелчков ... этот код находится внутри setOnClickListener
метод):
public void onClick(View v)
//delete corresponding player gender icon, player name and the delete button itself
PlayerDraft playerToDelete = idToPlayer.get(v.getId());
if(null != playerToDelete) {
ImageView iconToDelete = findViewById(playerToDelete.getIconViewId());
TextView textToDelete = findViewById(playerToDelete.getNameViewId());
Button b = (Button) v;
Log.d("thc", "Icon id that is to be deleted: " + iconToDelete.getId());
Log.d("thc", "name view id that is to be deleted: " + textToDelete.getId());
Log.d("thc", "delete button id to be deleted: " + b.getId());
player_display_view.removeView(iconToDelete);
player_display_view.removeViewInLayout(textToDelete);
player_display_view.removeViewInLayout(b);
//player_display_view.removeViewAt(0);
//player_display_view.removeAllViews()
Log.d("thc", "Number of elements in player_display_view scrollview: " + player_display_view.getChildCount());
} else {
Log.d("thc", "playerToDelete is null!");
}
}
Проблема в том, что вызов player_display_view.removeView(iconToDelete)
или любого подобного ему метода не работает! Однако вызов player_display_view.removeAllViews()
работает.
Я обнаружил следующую проблему. player_display_view
ScrollView всегда содержит только одного дочернего элемента, и этот дочерний элемент находится в позиции 0 в своем массиве дочерних элементов. Количество дочерних элементов не изменяется независимо от того, сколько просмотров добавляется в ScrollView во время выполнения, что просто поражает мое мнение: /. Как могут View даже отображаться внутри ScrollView (они тестируют его на моем телефоне), если они не указаны как дочерние элементы этого ScrollView ? Вызов метода player_display_view.removeViewAt(0);
для удаления этого единственного дочернего представления внутри ScrollView приводит к удалению не только одного Представления из ScrollView
, но ВСЕХ добавленных представлений.
Почему происходит следующее? Почему ScrollView содержит только одного дочернего элемента, несмотря на то, что несколько представлений добавляются в него во время выполнения? Как я могу удалить определенные виды внутри ScrollView?
Спасибо за потраченное время, я действительно ценю это