Достъп до 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 и да получа позицията на реда на този бутон?

РЕДАКТИРАНЕ: @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
final SettingsAdapter адаптер = нов SettingsAdapter(this, str, on_off_str); sett_list.setAdapter(адаптер); Просто низ [] с текст за текстов изглед и низ [] с включено или изключено състояние за бутон за превключване.   -  person mgulan    schedule 24.06.2013
comment
имах предвид е списък, низ [], hashmap   -  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) Връщане на модифицираните данни към дейността чрез деклариране на извикване на метод 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