Autore Topic: Dubbio gestione eventi nel BaseAdapter  (Letto 701 volte)

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Dubbio gestione eventi nel BaseAdapter
« il: 10 Febbraio 2015, 08:56:08 CET »
0
Salve

Ho una gridview con vari ImageButton, mi stavo domandando è corretto gestire gli eventi di click (OnclickListener) direttamente dal BaseAdapter ? in pratica questi bottoni mi permettono di passare ad altri Fragment o Activity.
(può darsi sia una domanda stupidissima ma avevo sto dubbio)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 711
  • Respect: +150
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Dubbio gestione eventi nel BaseAdapter
« Risposta #1 il: 10 Febbraio 2015, 10:22:47 CET »
0
Credo che sia il metodo migliore.

Considera però che l'evento viene intercettato da tutto il ListItem e non dal solo ImageButton.

In pratica se in un ListItem metti (ad esempio) due ImageButton, ovunque premi il risultato è lo stesso perché viene intercettato dal contenitore.

Potresti quindi sostituire l'ImageButton con un semplice ImageView ed avere lo stesso risultato - credo cambi solo il comportamento in termini di aspetto in caso di selezione/pressione.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Dubbio gestione eventi nel BaseAdapter
« Risposta #2 il: 10 Febbraio 2015, 10:29:50 CET »
0
Credo che sia il metodo migliore.

Considera però che l'evento viene intercettato da tutto il ListItem e non dal solo ImageButton.

In pratica se in un ListItem metti (ad esempio) due ImageButton, ovunque premi il risultato è lo stesso perché viene intercettato dal contenitore.

Potresti quindi sostituire l'ImageButton con un semplice ImageView ed avere lo stesso risultato - credo cambi solo il comportamento in termini di aspetto in caso di selezione/pressione.

Si nella mia GridView ci sono vari ImageButton e in teoria a seconda di quale si prema viene attivata un'Activity o Fragment. Non ho capito bene, dici che non mi funzionerebbe come voglio?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 711
  • Respect: +150
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Dubbio gestione eventi nel BaseAdapter
« Risposta #3 il: 10 Febbraio 2015, 10:46:17 CET »
0
Ok, credo di aver fatto confusione.

Cosa intendi di preciso per "gestire gli eventi di click (OnclickListener) direttamente dal BaseAdapter"?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Dubbio gestione eventi nel BaseAdapter
« Risposta #4 il: 10 Febbraio 2015, 10:57:16 CET »
0
Ok, credo di aver fatto confusione.

Cosa intendi di preciso per "gestire gli eventi di click (OnclickListener) direttamente dal BaseAdapter"?

Si scusa non mi sono spiegato bene in effetti.

Praticamente nella classe che estende BaseAdapter ho messo questo per gestire i vari bottoni che compongono la griglia:


Codice (Java): [Seleziona]
 


 @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View view = convertView;
        ViewHolder viewHolder;


     ......

      setCatImage(viewHolder, gridItems.title);

}

private void setCatImage(ViewHolder viewHolder, String catTitle) {


switch (catTitle){

            case ("Servizio 1"):

               viewHolder.imageButton.setBackgroundResource(R.drawable.ic_servizio1);

                viewHolder.imageButton.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {

                        Log.e("TAG", "POSITION CLICKED " + "Servizio 1");

                        Toast.makeText(context, "Servizio 1", Toast.LENGTH_SHORT).show();


                    }
                });
break;

case "Servizio 2":

...

}

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 711
  • Respect: +150
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Dubbio gestione eventi nel BaseAdapter
« Risposta #5 il: 10 Febbraio 2015, 11:38:02 CET »
0
Adesso ho capito.

Per funzionare, funziona.

Personalmente avrei passato un onClickListener al costruttore dell'adapter ed avrei assegnato quello a tutte le ImageView. Poi nel listener avrei determinato quale ImageView è stata cliccata.

E' un'inezia, ma così si risparmia un select case per ogni creazione della vista per essere effettuato solo al click. Senza considerare che così l'adapter che hai creato è più riusabile.

Codice (Java): [Seleziona]
private View.OnClickListener mClickListener;

public MioAdapter(...., View.OnClickListener clickListener) {
  ...
  mClickListener = clickListener;
}

...

private void setCatImage(ViewHolder viewHolder, String catTitle) {
...
  viewHolder.imageButton.setTag(catTitle);
  viewHolder.imageButton.setOnClickListener(mClickListener);
...
}

MioAdapter a = new MioAdapter(... , new View.OnClickListener() {

  @Override
  public void onClick(View v) {
    String catTitle = (String)v.getTag();
    switch (catTitle){
      case ("Servizio 1"):
        Log.e("TAG", "POSITION CLICKED " + "Servizio 1");

        Toast.makeText(context, "Servizio 1", Toast.LENGTH_SHORT).show();

        break;

      case "Servizio 2":
        ...
    }
  });
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Dubbio gestione eventi nel BaseAdapter
« Risposta #6 il: 10 Febbraio 2015, 17:13:46 CET »
0
capito..ma se dovessi richiamare un'Activity mica posso farlo da li giusto?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 711
  • Respect: +150
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Dubbio gestione eventi nel BaseAdapter
« Risposta #7 il: 10 Febbraio 2015, 17:23:24 CET »
0
Per richiamare un'activity ti basta avere un Context, e può essere quello della view:

Codice (Java): [Seleziona]
  @Override
  public void onClick(View v) {
    String catTitle = (String)v.getTag();
    switch (catTitle){
      case ("Servizio 1"):

        Intent i = ...
        v.getContext().startActivity(i);

        break;

      case "Servizio 2":
        ...
    }

quello che non puoi fare con poco lavoro è lo startActivityForResult
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.