Доступ к ToggleButtons в ListView

Я использую пользовательский адаптер (ListAdapter.java), который расширяет ArrayAdapter для заполнения ListView (List.java). После этого строка ListView содержит TextView и ToggleButton.

В List.java я могу зарегистрировать щелчок по строке ListView:

sett_list.setOnItemClickListener(new OnItemClickListener() {
     public void onItemClick(AdapterView<?> parent, android.view.View view, int position, long id) {

но как я могу зарегистрировать нажатие на ToggleButton и получить позицию строки этой кнопки?

EDIT: @MDMalik

В ListAdapter.java:

A):

View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.settings_row, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.option);
        final ToggleButton toggle = (ToggleButton) rowView.findViewById(R.id.toggle);

B):

if (values2[position].equals("on")) {
            toggle.setChecked(true);
        } else {
            toggle.setChecked(false);
        }

C):

toggle.setTag(Integer.valueOf(position));
        toggle.setOnClickListener(new OnClickListener() {

             @Override
             public void onClick(View v) {
                 Toast.makeText(getContext(), Integer.valueOf(position) + " : Click", Toast.LENGTH_SHORT).show();
             }
        });

Вот и все. Теперь у меня есть позиция нажатой кнопки. Спасибо.

Как мне теперь записать результат в базу данных?

Что-то вроде этого (не работает):

toggle.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                 if (toggle.isChecked() == true) {
                        checked = 1;
                        myDB = SQLiteDatabase.openOrCreateDatabase("database.db", null);
                        myDB.execSQL("UPDATE " + TableName + " SET  on_off_ = 'on' WHERE sett_ = '" + values[position] + "'");
                        myDB.close();
                    } else {
                        checked = 0;
                        myDB = SQLiteDatabase.openOrCreateDatabase("database.db", null);
                        myDB.execSQL("UPDATE " + TableName + " SET  on_off_ = 'off' WHERE sett_ = '" + values[position] + "'");
                        myDB.close();
                    }

             }
        });

person mgulan    schedule 23.06.2013    source источник
comment
значит, как узнать, выбран он или нет?   -  person MDMalik    schedule 24.06.2013
comment
да, и в какой строке (позиции) выбрана кнопка.   -  person mgulan    schedule 24.06.2013
comment
и что вы передаете в CustomAdapter. потому что это самое главное   -  person MDMalik    schedule 24.06.2013
comment
окончательный адаптер SettingsAdapter = новый SettingsAdapter (this, str, on_off_str); set_list.setAdapter (адаптер); Просто строка [] с текстом для просмотра текста и строка [] с включенным или выключенным состоянием для кнопки переключения.   -  person mgulan    schedule 24.06.2013
comment
я имел в виду список, строка [], хэш-карта   -  person MDMalik    schedule 24.06.2013


Ответы (2)


A) Поскольку у вас есть CustomAdapter, вам необходимо активировать ToggelButton в getView.

B) Ваш массив String должен иметь значение по умолчанию для этой кнопки, либо true, либо false, что может быть достигнуто примерно так

String chkCondition = hmap.get("chk").toString().toLowerCase();
Boolean blnChk = true;
if (chkCondition.equals("false"))
{    blnChk = false;   }
chkBox.setChecked(blnChk);

C) Затем вам нужно объявить onClickListener для того, где в основном переустановите ваш исходный массив, найдя значение TextView и новое значение chk.

private void setCheckValue(String Condition, String upc) {
  for (int i = 0; i < data.size(); i++) {
     String Upccode = data.get(i).get("UpcCode").toString();
     if (Upccode.equals(upc)) {
        HashMap<String, String> hmap = new HashMap<String, String>();
        hmap = data.get(i);
        hmap.put("chk", Condition);
        data.set(i, hmap);
        break;
     }
  }
}

D) Возврат измененных данных в Activity путем объявления вызова метода getData()

public ArrayList<HashMap<String, String>> getData() {
    return data;
}

Я использую data в своем CustomAdapter. Data это ArrayList<HashMap<String, String>> .

Изменить Я не выполняю команду SQL при изменении переключателя. Я собираю их в массив. Тогда у вас, очевидно, есть кнопка Submit в вашей деятельности. После того, как вы нажмете кнопку отправки. Я получаю Data из CustomAdapter. Что сделано getData(), это даст вам HashMap в вашей деятельности.

person MDMalik    schedule 23.06.2013
comment
У меня нет кнопки отправки... ToggleButton — моя кнопка отправки. Могу ли я выполнить команду SQL непосредственно из адаптера с помощью переключателя? - person mgulan; 24.06.2013

Я обычно добиваюсь этого, устанавливая обычные слушатели внутри Adapter при раздувании View в getView, а также запоминая позицию для этого View внутри тега.

Взгляните на этот рабочий пример: ButtonsProblemsExampleActivity.java.

person MaciejGórski    schedule 23.06.2013
comment
@mgulan Много кода в моем демонстрационном проекте. Вы даже можете скачать и запустить его. - person MaciejGórski; 24.06.2013