Android Gridview и getChildAt с NullPointerException - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть пользовательский интерфейс, который состоит из Gridview, загруженного с пользовательским адаптером.ButtonAdapter, в этом случае.Таким образом, сетка загружается нормально, щелчки кнопок работают так, как я хочу, но теперь я должен указать на кнопке, что это «активный» выбор.

Я думал, что сделаю это, просто отслеживаяи изменение фона.Как выясняется, и, основываясь на паре постов здесь на SO, кнопки на самом деле не существуют, когда они находятся за пределами экрана ... и даже сразу после прокрутки.Я часто получаю исключение NullPointerException при попытке изменить фон кнопки после прокрутки.

Я пытался изменить представления в адаптере на RadioButtons и ToggleButtons, но все они предлагают аналогичные ограничения.

Проблема, по-видимому, главным образом связана с getChildAt (), который я использую в сетке, чтобы "отменить выбор" одной кнопки или чего-либо еще, когда выбрана другая.

Есть ли обходной путь для этого или, возможно, другойпредложение аналогичного функционала.Вертикально прокручиваемый, похожий на сетку формат и т. Д. *

Спасибо за помощь.

РЕДАКТИРОВАТЬ: Спасибо, Крейги ... Я забыл поставить там платформу o.0...я добавлю андроида.

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Рассматривали ли вы использование Selector ?В неведении о том, как работает ваш buttonAdapter или из чего вы его извлекаете, вы можете настроить изменяемый фон любого представления в соответствии с его состоянием с помощью селекторов.

Если ваш селектор определен так (при условииконечно, наличие подходящих объектов рисования:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_focused="true"
          android:drawable="@drawable/list_item_pressed" />
    <item android:state_pressed="true"
          android:drawable="@drawable/list_item_pressed" />
    <item android:state_selected="true"
          android:state_activated="true"
          android:drawable="@drawable/list_item_selected" />
    <item android:state_activated="true"
          android:drawable="@drawable/list_item_selected" />
    <item android:state_selected="true"
          android:drawable="@android:color/black" />
    <item android:drawable="@android:color/transparent" />
</selector>

А затем установите режим выбора GridView на один Выбор:

<GridView
   ...
   android:choiceMode="singleChoice" />

Это позволяет ОС обо всем позаботиться для вас с точки зрениязапомнить, какая позиция выбрана в списке, а затем очистить ее, когда вы нажмете другую

1 голос
/ 29 марта 2012

Ну, это может не совсем ответить на ваш вопрос, но я сделал нечто подобное.По сути, я добавил элементы в таблицу, и мне нужно было иметь кнопку удаления, связанную с элементом.При нажатии кнопки «Удалить» необходимо было удалить только этот элемент из таблицы.Это может быть адаптировано к вашим потребностям, поэтому вместо того, чтобы удалять элемент, по которому щелкнули, он находит предыдущий элемент, отключает его, а затем выделяет, а затем вновь щелкнул один.

Итак, я сделал тег для самих кнопок (очевидно, они должны быть уникальными).Когда кнопка нажата, сохраните ее тег в чем-то вроде sharedPreference для дальнейшего использования.Затем, когда нажата новая кнопка, просто найдите кнопку с ранее нажатым тегом и снимите отметку со строки, в которой она находится, а затем отметьте строку для вновь нажатой кнопки.Вот код, который я использовал (извините, имена переменных ужасны, у меня фактически это работало в тестовом приложении, которое никогда не выпускалось, поэтому я не удосужился дать им лучшие имена):Я не подозреваю, что это именно тот ответ, который вы ищете, но, возможно, он даст вам идею попробовать.Надеюсь, в этом есть какой-то смысл, если нет, пожалуйста, не стесняйтесь просить разъяснений.Извините, если это далеко от базы.

1 голос
/ 26 марта 2012

Установите тег для каждого из представлений, которые адаптер создает в getView ().Позже найдите представление с этим тегом с помощью gridView.findViewByTag () или получите тег представления с помощью view.getTag ().

...