Как удалить один вид внутри ScrollView - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть 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?

Спасибо за потраченное время, я действительно ценю это

1 Ответ

0 голосов
/ 11 ноября 2018

Как правило, ScrollView содержит только одного ребенка. Обычно это контейнер (например, LinearLayout или RelativeLayout), который прокручивается с помощью ScrollView. Если вы динамически (программно) добавляете View s к ScrollView, возможно, он создал внутренний контейнер Layout для хранения добавленных вами представлений.

Вы должны поместить Layout в свой ScrollView и управлять (добавлять / удалять) своими View внутри этого Layout. Тогда ваш код удаления должен работать.

...