AlertDialog.Builder проблема с доступом к определенной строке - PullRequest
0 голосов
/ 09 марта 2011

Я работал над этим приложением, но столкнулся с проблемой, которую мне не удалось выяснить. У меня есть просмотр списка, который заполняется содержимым от адаптера, и каждая строка имеет свою конкретную информацию (Uniform). Проблема возникает, когда я пытаюсь получить значение флажка, найденного в этой конкретной строке.

Код, указанный ниже:

Я создаю объект AlertDialog, чтобы получить информацию от пользователя. Мой код компоновки состоит из LinearLayout в горизонтальной ориентации с 3 элементами: изображение, текст, флажок. Я создаю свой AlertDialog с R.layout.listview_layout, который я создал.

Однако я попытался получить CheckBox View от адаптера; когда я смотрю на него через cb.isChecked (), независимо от того, в какой строке я нахожусь, он всегда непроверен (иначе false). Для дальнейшей отладки я взял тот же адаптер и извлек текст по той же методологии, и он вернул конкретную информацию об этой строке, как и должно быть.

Есть идеи, как с этим справиться?

Проще говоря:

Я просто хотел бы получить значение CheckBox в каждой строке

c = help.returnContacts();</p> <pre><code> AlertDialog.Builder ab = new AlertDialog.Builder(this); ab.setTitle("Select contacts"); final SimpleCursorAdapter adapter = new SimpleCursorAdapter( getApplicationContext(), R.layout.listview_layout, c, new String[] { ClientOpenDbHelperUtility.COL_NAME, ClientOpenDbHelperUtility.COL_SEL }, new int[] { R.id.txt_name, R.id.cb_select }); ab.setAdapter(adapter, null); ab.setPositiveButton("Confirm", new Dialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Cursor c = adapter.getCursor(); for (int i = 0; i < adapter.getCount(); i++) { CheckBox cb = (CheckBox) adapter.getView(i, null, null) .findViewById(R.id.cb_select); TextView t = (TextView) adapter.getView(i, null, null) .findViewById(R.id.txt_name); Log.d("DEBUG", "Checked = " + cb.isChecked()); Log.d("DEBUG", "Message = " + t.getText().toString()); if (cb.isChecked()) { help .updateSelection( c .getColumnIndex(ClientOpenDbHelperUtility.COL_UID), true); } else { help .updateSelection( c .getColumnIndex(ClientOpenDbHelperUtility.COL_UID), false); } } c.close(); help.closeAll(); } }); ab.show(); }

Спасибо за чтение!

1 Ответ

2 голосов
/ 09 марта 2011

Вы не должны звонить getView напрямую.Это создает новый вид (или перезаписывает и перезаписывает старый) на основе содержимого вашей базы данных.

Кроме того, когда ваши строки прокручиваются за верхнюю или нижнюю часть экрана, они будут переработаны для использования в новых появляющихся строках.Все ваши данные, но видимые в данный момент строки, скорее всего, уже исчезнут к тому времени, когда будет вызван ваш метод onClick.

У вас есть два варианта:

  1. Сохранять изменения немедленно в базе данных - установить OnClickListener в поле или строке и обновлять базу данных при каждом событии клика.

  2. Сохранитьизменяет переменную экземпляра и затем применяет позже - определите переменную экземпляра Map<Integer, Boolean> changes для своей деятельности и вызывайте changes.put(position, isChecked) всякий раз, когда происходит щелчок.Затем, когда ваш пользователь нажмет «Применить» или что-то еще, что вы onClick, перейдите через changes и сохраните каждое из них в базе данных.По сути, это то же самое, что и сейчас, за исключением того, что вы будете использовать стабильный объект для хранения несохраненных изменений.

...