Autore Topic: Comportamento elemento listview al click  (Letto 604 volte)

Offline sncmll

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
Comportamento elemento listview al click
« il: 15 Maggio 2013, 23:13:23 CEST »
0
So che è un argomento largamente trattato, ma sto avendo un problema nel realizzare una listview del tipo mostrato nell'immagine in allegato.

Come sapete sicuramente, il tap su un punto qualsiasi della superficie di questo elemento (checkbox incluso), comporta la selezione o la deselezione dello stesso checkbox.

Il mio problema è dovuto al fatto che il checkbox vive di "vita propria" , nel senso che:
-se clicco su un punto che non è il checkbox, il checkbox si seleziona(da come implementato nel codice java)  e viene scaturita l'azione settata con OnItemClickListener;
- se clicco proprio sul checkbox(e non sull'elemento listview)il checkbox stesso si seleziona,  ma non viene scaturita nessuna azione perché è  la riga della listview ad essere sensibile .

La mia domanda è: Come faccio a rendere il checkbox non clicckabile? O meglio come faccio a fare in modo che cliccando sul checkbox, cliccko anche sull'elemento della listview??

Ho provato a impostare nel layout della riga, nel checkbox, il comando android:focusable="false" e android:focusableInTouchMode="false"
android:clickable="false" ,ma purtroppo non funziona.

Vi posto il layout della riga della listview:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@drawable/list_element"
   android:orientation="horizontal" >

    <CheckBox
       android:id="@+id/prestazione"
       android:layout_width="22dp"
       android:layout_height="22dp"
       android:layout_gravity="center"
       android:layout_marginLeft="8dp"
       android:button="@drawable/button_check"
       android:focusable="false" />

    <TextView
       android:id="@+id/nome_prestazione"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_marginLeft="8dp"
       android:layout_marginRight="5dp"
       android:layout_weight="20"
       android:gravity="center_vertical"
       android:paddingBottom="15dp"
       android:textColor="@color/blue_text"
       android:textSize="16sp"
       android:textStyle="bold" >
    </TextView>

    <TextView
       android:id="@+id/prezzo"
       android:layout_width="47dp"
       android:layout_height="match_parent"
       android:layout_gravity="center"
       android:layout_marginBottom="2dp"
       android:layout_marginRight="2dp"
       android:layout_marginTop="2dp"
       android:background="@drawable/sfondoprezzo"
       android:gravity="center"
       android:padding="0dp"
       android:textColor="@color/white"
       android:textStyle="bold" >
    </TextView>

</LinearLayout

Grazie in anticipo per la vostra attenzione :)
« Ultima modifica: 15 Maggio 2013, 23:32:45 CEST da sncmll »

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Comportamento elemento listview al click
« Risposta #1 il: 16 Maggio 2013, 13:24:26 CEST »
0
2 possibili soluzioni (che non ho testato):

1- prova ad usare la propietà Enabled del checkbox, impostandola su false

2- fai l'override del metodo onTouch della checkbox, ritornando sempre true
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline sncmll

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
Re:Comportamento elemento listview al click
« Risposta #2 il: 16 Maggio 2013, 17:07:22 CEST »
0
Grazie per aver risposto anzitutto :D

La prima soluzione l'avevo già provata, e "diciamo" che funziona nel senso che se prima il checkbox viveva di vita proprio
adesso è morto proprio :D

Tappandoci sopra non succede completamente nulla, mentre se tappo altrove sulla riga, il checkbox si seleziona.

Per quanto riguarda la seconda soluzione, in che modo dovrei ridefinire l'onTouch() , o meglio ancora, dove devo ridefinirlo? :D

Grazie ancora di tutto!

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Comportamento elemento listview al click
« Risposta #3 il: 16 Maggio 2013, 19:35:45 CEST »
+1
Avevo capito male... pensavo volessi "far morire" il checkbox, lasciando la possibilità all'utente del click solo sulla riga.

Se vuoi che al click sulla checkbox si attivi anche il click sulla riga, puoi fare l'override del metodo onClick tramite checkbox.setonclicklistener.
Dentro all'onClick puoi avviare il codice che hai nel onitemclicklistener della listview oppure fare v.getParent().performClick()
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline sncmll

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
Re:Comportamento elemento listview al click
« Risposta #4 il: 16 Maggio 2013, 23:25:31 CEST »
0
Scusami,
dentro all'onClick del checkbox(il quale è implementato nel customadapter che estende ArrayAdapter<myobject>) ho inserito v.getParent().performClick(), ma mi restituisce false.
E da quello che ho capito significa che la vista padre non possiede un onitemclicklistener .
Ma io implemento l' onitemclicklistener  della listview,e lo implemento dentro un fragment.
Potrebbe essere questo il problema???

Ti ringrazio ancora per il tuo tempo dedicatomi :)

Post unito: 17 Maggio 2013, 02:31:33 CEST
Purtroppo è tutta la sera che ci provo ma niente da fare.

Posto il codice, magari sbaglio qualcosa...

Questo è il customAdapter:
Codice (Java): [Seleziona]
public class SelectArralAdapter extends ArrayAdapter<Prestazione>{
        private LayoutInflater inflater;

   

        public SelectArralAdapter(Context context, List<Prestazione> prestazioniList) {
              super(context, R.layout.riga_lista, R.id.prestazione, prestazioniList);//mi dimentico momentaneamente del prezzo
             
           
             // Cache the LayoutInflate to avoid asking for a new one each time.
             inflater = LayoutInflater.from(context);
            }







        @Override
    public View getView(int position, View convertView, ViewGroup parent) {
     
               
                // Prestazioni to display
      Prestazione prestazione = (Prestazione) this.getItem(position);

      // The child views in each row.
      CheckBox checkBox;
      TextView textView;
      TextView textView1;

      // Create a new row view
      if (convertView == null) {
        convertView = inflater.inflate(R.layout.riga_lista, null);
     
        // Find the child views.
        textView = (TextView) convertView.findViewById(R.id.prezzo);
        checkBox = (CheckBox) convertView.findViewById(R.id.prestazione);
        textView1 = (TextView) convertView.findViewById(R.id.nome_prestazione);
        // Optimization: Tag the row with it's child views, so we don't
        // have to call findViewById() later when we reuse the row.
        convertView.setTag(new SelectViewHolder(textView, checkBox,textView1));
        // If CheckBox is toggled, update the planet it is tagged with.
       
        checkBox.setOnClickListener(new View.OnClickListener() {
          public void onClick(View v) {
                 
                 
                  //Qui dovrei implementare un meccanismo per cui alla pressione del checkbox si ha l'esecuzione scaturita
                  //dalla riga della lista.
                 
                CheckBox checkbox = (CheckBox) v;
            Prestazione prestazione = (Prestazione) checkbox.getTag();
            prestazione.setChecked(checkbox.isChecked());
           
           
           
           
          }
        });
      }

   // Reuse existing row view
      else {
        // Because we use a ViewHolder, we avoid having to call
        // findViewById().
        SelectViewHolder viewHolder = (SelectViewHolder) convertView.getTag();
        checkBox = viewHolder.getCheckBox();
        textView = viewHolder.getTextView();
        textView1 = viewHolder.getTextView1();
      }

   // Tag the CheckBox with thePrestazione it is displaying, so that we can
      // access the Prestazione in onClick() when the CheckBox is toggled.
      checkBox.setTag(prestazione);
   
     
      // Display Prestazione data
      checkBox.setChecked(prestazione.isChecked());
      textView1.setText(prestazione.getNomePrestazione());
      textView.setText(prestazione.getPrezzo()+"");//mi tocca trasformarlo in stringa
     
     
      return convertView;
    }

}



Questo, invece è il fragment in cui invoco onitemclicklistener della listview(Comunico con l'activity container attraverso un'interfaccia):
Codice (Java): [Seleziona]
public class PrestazioniFragment extends Fragment {

        private ListView list_view;
       
          private SelectArralAdapter listAdapter;
          ArrayList<Prestazione> listPrestazioni;
      private String title;
   
 
                 
               

       
       
       
        // activity listener
            private Comunicazione_pren_prest com_pre_prest;

                /**quando avviene un evento nel frammento, viene eseguito prima il listener nel frammento,
                 * e questo chiama la funzione implementata nell’ attività contenitrice attraverso l'interfaccia interna al frammento:
                 * in questo modo si possono passare variabili dal frammento all’ attività
                 */

               
                // Container Activity must implement this interface
         public interface Comunicazione_pren_prest {
                public void incrementa_selezioni();
                public void decrementa_selezioni();
            public String dammi_title();
            public ArrayList<Prestazione> dammi_listato();
            public void aggiungiAlleScelte(Prestazione prestazione);
            public void togliDalleScelte(Prestazione prestazione);
         
         
         
         }
               

         /**Controllo che l'interfaccia sia implementata dall'activity container" */
         // onAttach
         @Override
         public void onAttach(Activity activity) {
            super.onAttach(activity);
            try {
                com_pre_prest = (Comunicazione_pren_prest) activity;
            } catch (ClassCastException e) {
               throw new ClassCastException(activity.toString()+" must implement Comunicazione_pren_prest");
            }
         }
               
               
               
       
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);}
 
 
       
       
        @Override
           public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
              View view = inflater.inflate(R.layout.activity_prestazioni_fragment,container,false);
               
             
              //prelevo info dall'activity container
                         title=com_pre_prest.dammi_title();
                         
                         listPrestazioni=com_pre_prest.dammi_listato();
                         
                         
                         
                         //Modifico aspetto schermata
                      getActivity().setTitle(title);   //imposto titolo schermata //INVOCO METODO DELL'ACTIVITY CONTAINER
                         
                   
                   
                     
                     
                   
                             
                         // Find the ListView resource.
                    list_view=(ListView)view.findViewById(R.id.listView1);
                   
                  //partendo da un ARRAYLIST INSTANZIO UN CUSTOM ADAPTER!!!!
                     listAdapter = new SelectArralAdapter(getActivity(), listPrestazioni);
                     list_view.setAdapter(listAdapter);
                   
                     
                  // When item is tapped, toggle checked properties of CheckBox and Prestazione.
                     list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                           @Override
                           public void onItemClick(AdapterView<?> parent, View view_line,int position, long id) {
                                 
                              Prestazione prestazione = listAdapter.getItem(position);//prendi l'elemento della lista a quella posizione
                               prestazione.toggleChecked(); //seleziona dentro quell'elemento checked=true
                               SelectViewHolder viewHolder = (SelectViewHolder) view_line.getTag();//prendi il tag della view cliccata
                               viewHolder.getCheckBox().setChecked(prestazione.isChecked()); //vai a settare il checkbox di quella view
                               
                               
                              if(prestazione.isChecked()){
                                 com_pre_prest.incrementa_selezioni();//incremento contatore appartenente ad activity container
                                 com_pre_prest.aggiungiAlleScelte(prestazione);
                              }
                              else{
                                  com_pre_prest.decrementa_selezioni();//decremento contatore appartenente ad activity containe
                                  com_pre_prest.togliDalleScelte(prestazione);
                                  }
                              }  
                             });
                               
                               
                             
                               
                             
                           
         
                     
                     
                       

                   
                   

                   
                     
                     
                  return view;
                 }


       
       
   
        }
« Ultima modifica: 17 Maggio 2013, 02:32:30 CEST da sncmll »