Autore Topic: come gestire CheckBox in ListView  (Letto 458 volte)

Offline bigpea

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 7
come gestire CheckBox in ListView
« il: 25 Settembre 2014, 11:22:19 CEST »
0
Ciao a tutti,
ho un problema riguardo la gestione di una CheckBox in una Listview.
Mi spiego meglio, ho creato una listview (tramite SimpleAdapter) dando all'utente la possibilità di modificare o inserire voci.

Ora, vorrei inserire una checkbox, ed a livello pratico l'ho inserita, il mio problema è che non so come intercettare l'evento del check.
Al momento gestisco il tocco breve sull'item delal listview ed il tocco prolungato, ma come intercetto il check?

Ho provato a seguire vari tutorial ma con nessuno sono riuscito a risolvere il problema.

Grazie mille.

Offline BlackJad

  • Utente junior
  • **
  • Post: 59
  • Respect: +6
    • Google+
    • michele-ziparo/4/825/a99/
    • blackjad82
    • Mostra profilo
    • Datawit Systems
  • Dispositivo Android:
    Samsung Galaxy S3
  • Play Store ID:
    Michele Ziparo
  • Sistema operativo:
    Windows 8.1
Re:come gestire CheckBox in ListView
« Risposta #1 il: 26 Settembre 2014, 00:30:51 CEST »
0
Sicuramente avrai sviluppato un tuo adapter per questo scopo, quindi semplicemente potresti creare anche una interfaccia ed implementarla nell'activity che ospita la tua lista.

In questa interfaccia dichiara un metodo del tipo notifica(posizione).

Nell'adapter, quindi, crei un oggetto del tipo dell'interfaccia, e quando crei l'oggetto dell'adapter stesso, gli passi l'activity, ad esempio nel costruttore.

Imposta un listener sull'evento di check nell'adapter: quando si scatena, chiama il metodo notifica(posizione) dell'interfaccia.

In questo modo alla tua activity arriverà l'evento e lo potrai intercettare al di fuori dell'adapter.

Offline bigpea

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 7
Re:come gestire CheckBox in ListView
« Risposta #2 il: 26 Settembre 2014, 16:19:17 CEST »
0
Ok, intanto grazie per la risposta.
Premetto che non sono molto pratico ma ho fatto delle ricerche in base ai tuoi suggerimenti.
Dimmi se ho inteso male qualcosa o intendevi questo.

Ho inserito la seguente riga nella checkboxe:
Codice (XML): [Seleziona]
android:onClick="onCheckboxClicked"
e nell'activity ho implementato il metodo:
Codice (Java): [Seleziona]
    public void onCheckBoxClicked(View v){

        if(v.getId()==R.id.checkbox_buy){
            if(buy.isChecked())
                Log.d(TAG, "ON");
            else
                Log.d(TAG, "OFF");
        }


    }

Al momento, dopo queste implementazioni, il problema è che il tutto finisce con questo errore:
Codice (Java): [Seleziona]
    java.lang.IllegalStateException: Could not find a method onCheckboxClicked(View) in the activity class android.app.Application for onClick handler on view class android.widget.CheckBox with id 'checkbox_buy'
            at android.view.View$1.onClick(View.java:3956)
            at android.view.View.performClick(View.java:4637)
            at android.widget.CompoundButton.performClick(CompoundButton.java:104)
            at android.view.View$PerformClick.run(View.java:19422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5586)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
     Caused by: java.lang.NoSuchMethodException: onCheckboxClicked [class android.view.View]

Offline BlackJad

  • Utente junior
  • **
  • Post: 59
  • Respect: +6
    • Google+
    • michele-ziparo/4/825/a99/
    • blackjad82
    • Mostra profilo
    • Datawit Systems
  • Dispositivo Android:
    Samsung Galaxy S3
  • Play Store ID:
    Michele Ziparo
  • Sistema operativo:
    Windows 8.1
Re:come gestire CheckBox in ListView
« Risposta #3 il: 26 Settembre 2014, 16:36:05 CEST »
0
Allora, l'approccio corretto secondo me è questo:

Crei una nuova interfaccia

Codice (Java): [Seleziona]
public interface OnCustomEventListener {
        public void onEvent(int position);
}

Poi dichiari che la tua activity, la implementa

Codice (Java): [Seleziona]
public class MyActivity implements OnCustomEventListener
e fai l'override del metodo dentro l'activity

Codice (Java): [Seleziona]
@Override
public void onEvent(int position) {

}

Successivamente, dichiari un oggetto nell'adapter

Codice (Java): [Seleziona]
OnCustomEventListener mListener;
e in un punto qualsiasi, sempre dell'adapter, magari nel costruttore, o in un altro metodo, passi l'activity come listener, ad esempio

Codice (Java): [Seleziona]
public void setCustomEventListener(OnCustomEventListener eventListener) {
                mListener=eventListener;
        }

Quest'ultimo metodo, o cmq il passaggio, deve essere richiato dall'activity

Codice (Java): [Seleziona]
adapter.setCustomEventListener(this);
In questo modo, l'activity diventa il punto principale in cui intercetti l'evento, perchè dell'adapter puoi fare

Codice (Java): [Seleziona]
if(mListener!=null) mListener.onEvent();

Offline bigpea

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 7
Re:come gestire CheckBox in ListView
« Risposta #4 il: 26 Settembre 2014, 17:35:57 CEST »
0
Dunque, ho letto la tua spiegazione e mi sembra molto chiara, di fatto però non ho creato un adapter mio ma ho utilizzato SimpleAdapter:

Codice (Java): [Seleziona]
        SimpleAdapter adapter=new SimpleAdapter(
                getApplicationContext(),
                data,//sorgente dati
                R.layout.child_row, //layout contenente gli id di "to"
                from,
                to);

Quindi la tua soluzione non la posso attuare a meno che di non creare un adapter mio, cosa che non ho mai fatto ma se è necessario..

Offline BlackJad

  • Utente junior
  • **
  • Post: 59
  • Respect: +6
    • Google+
    • michele-ziparo/4/825/a99/
    • blackjad82
    • Mostra profilo
    • Datawit Systems
  • Dispositivo Android:
    Samsung Galaxy S3
  • Play Store ID:
    Michele Ziparo
  • Sistema operativo:
    Windows 8.1
Re:come gestire CheckBox in ListView
« Risposta #5 il: 26 Settembre 2014, 18:10:31 CEST »
+1
Dunque, ho letto la tua spiegazione e mi sembra molto chiara, di fatto però non ho creato un adapter mio ma ho utilizzato SimpleAdapter:

Codice (Java): [Seleziona]
        SimpleAdapter adapter=new SimpleAdapter(
                getApplicationContext(),
                data,//sorgente dati
                R.layout.child_row, //layout contenente gli id di "to"
                from,
                to);

Quindi la tua soluzione non la posso attuare a meno che di non creare un adapter mio, cosa che non ho mai fatto ma se è necessario..
Guarda, è semplicissimo, ti basta estendere un BaseAdapter ;)

Offline bigpea

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 7
Re:come gestire CheckBox in ListView
« Risposta #6 il: 26 Settembre 2014, 18:25:03 CEST »
0
Ok grazie mille per la disponibilità. Se riesco faccio dei tentativi questo we altrimenti lunedì e ti faccio sapere. Grazie ancora.

Offline bigpea

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 7
Re:come gestire CheckBox in ListView
« Risposta #7 il: 29 Settembre 2014, 14:20:23 CEST »
0
Rieccomi, come promesso ho fatto i miei tentativi, tuttavia qualcosa è andato storto perchè non intercetto alcun evento.
Diciamo che neanche il click lungo e quello corto che prima riuscivo a intercettare ma per questo non mi preoccupo al momento.
Ti ricapitolo quello che ho fatto, vediamo dove sbaglio:

Creata una nuova interfaccia solo con questo codice:
Codice (Java): [Seleziona]
public interface OnCustomEventListener {
    public void onEvent(int position);

}

Implementata questa interfaccia nella mia activity:

Codice (Java): [Seleziona]
public class GiftActivity extends ListActivity implements OnCustomEventListener {...}
fatto l'verride del metodo dentro la mia activity

Codice (Java): [Seleziona]
    @Override
    public void onEvent(int position) {

        Log.d(TAG, "evento intercettato, position: " + position);

    }

Nell'adapter personalizzato ho dichiarato il nuovo oggetto:

Codice (Java): [Seleziona]
public class GiftAdpter extends BaseAdapter {
    private List<Gift> gift=null;
    private Context context=null;
    OnCustomEventListener mListener;
    //private SimpleDateFormat simple=new SimpleDateFormat("dd/MM",Locale.ITALIAN);

    public GiftAdpter(Context context,List<Gift> gift)
    {
        this.gift=gift;
        this.context=context;

    }

    public void setCustomEventListener(OnCustomEventListener eventListener) {
        mListener=eventListener;
    }



    @Override
    public int getCount()
    {
        return gift.size();
    }




    @Override
    public Object getItem(int position)
    {
        return gift.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return getItem(position).hashCode();
    }

    @Override
    public View getView(int position, View v, ViewGroup vg)
    {
        if (v==null)
        {
            v= LayoutInflater.from(context).inflate(R.layout.child_row, null);
        }
        Gift ai=(Gift) getItem(position);
        TextView txt=(TextView) v.findViewById(R.id.giftName);
        txt.setText(ai.getGift_name());
        txt=(TextView) v.findViewById(R.id.price);
        txt.setText(ai.getGift_price());
        return v;
    }

}

ho richiamato il metodo setCustomEventListener, dichiarato nell'adapter, nell'onCreate dell'activity:

Codice (Java): [Seleziona]
adapter.setCustomEventListener(this);

Per il resto ho qualche dubbio sul punto in cui inserire questa istruzione:
Codice (Java): [Seleziona]
if(mListener!=null) mListener.onEvent();
Anche forzandola sotto la riga appena inserita nell'activity non succede nulla al click:
Codice (Java): [Seleziona]
        adapter.setCustomEventListener(this);

        if(mListener!=null) mListener.onEvent(1);

Grazie mille.

Post unito: 29 Settembre 2014, 18:17:57 CEST
Ok, ora tutto funziona correttamente :D
Grazie mille per i tuoi suggerimenti..
« Ultima modifica: 29 Settembre 2014, 18:17:58 CEST da bigpea, Reason: Merged DoublePost »

Offline BlackJad

  • Utente junior
  • **
  • Post: 59
  • Respect: +6
    • Google+
    • michele-ziparo/4/825/a99/
    • blackjad82
    • Mostra profilo
    • Datawit Systems
  • Dispositivo Android:
    Samsung Galaxy S3
  • Play Store ID:
    Michele Ziparo
  • Sistema operativo:
    Windows 8.1
Re:come gestire CheckBox in ListView
« Risposta #8 il: 30 Settembre 2014, 00:47:54 CEST »
0
Ottimo ;)