Autore Topic: Problema listview checkbox  (Letto 1251 volte)

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Problema listview checkbox
« il: 25 Giugno 2014, 15:28:25 CEST »
0
Ciao a tutti ho creato una listview con testo e checkbox che viene alimentata da un DB. Fin qui tutto bene ho creato il layout riga il simpleadapter personalizzando il metodo getView dove gestisco il click sui chekbox.

Il problema è che checcando una voce per esempio la prima  mi si checca anche la riga 10, ad ogni check ho due righe a true a distanza di 10 righe.

Qualcuna mi sa aiutare? dovrebbe essere un errore stupido.

Grazie

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:Problema listview checkbox
« Risposta #1 il: 25 Giugno 2014, 16:21:45 CEST »
0
Avevo avuto un problema simile in passato, che non riuscivo a gestire il click all'interno di un item di una listview. Adesso non ricordo bene, però è una questione di listener. Se mi viene in mente di piu' faccio sapere.
I numeri contano molto di più del seme.

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Problema listview checkbox
« Risposta #2 il: 25 Giugno 2014, 21:57:51 CEST »
0
Grazie

Inviato dal mio Nexus 5 utilizzando Tapatalk


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:Problema listview checkbox
« Risposta #3 il: 05 Luglio 2014, 16:52:33 CEST »
0
Secondo me il tuo problema è nel metodo getView dell'adapter. Puoi postare il codice che hai usato?

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Problema listview checkbox
« Risposta #4 il: 08 Luglio 2014, 15:51:45 CEST »
0
Si eccolo è un metodo che ritorna l'adapter che poi assegno alla lista.

Codice (Java): [Seleziona]
private SimpleAdapter GetAdapter(final ArrayList<HashMap<String, Object>> data) {
                        String[] campi = {"titolo","autore","link","immagine"};
                        int[] controlli = {R.id.checkedTextRicetta,R.id.txt_r_online_autore,0,0};
                       
                        SimpleAdapter adapt = new SimpleAdapter(getActivity().getBaseContext(),data,R.layout.riga_ricetteonline, campi,controlli){

                                @Override
                                public View getView(int position, View convertView,
                                                ViewGroup parent) {
                                        View  view = super.getView(position, convertView, parent);
                                        final CheckedTextView  cht = (CheckedTextView  )view.findViewById(R.id.checkedTextRicetta);
                                //CheckBox ch = (CheckBox)view.findViewById(R.id.check_r_onLine);                                                      
                                HashMap<String,Object> data = (HashMap<String,Object>)getItem(position);
                                cht.setTag(data.get("link").toString());
                                cht.setOnClickListener(new OnClickListener() {
                                               
                                                @Override
                                                public void onClick(View v) {
                                                        if (cht.isChecked()){
                                                                cht.setChecked(false);
                                                                selezionati.remove(cht.getTag().toString());
                                                               
                                                        }else{
                                                                cht.setChecked(true);
                                                                selezionati.add(cht.getTag().toString());
                                                               
                                                        }
                                                       
                                                }
                                        });                                                      
                                                                                                                                                                             
                                return view;
                                }
                               
                               
                        };
                        return adapt;
                }

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:Problema listview checkbox
« Risposta #5 il: 08 Luglio 2014, 17:01:03 CEST »
0
Penso che un approccio migliore sia l'utilizzo del pattern ViewHolder, probabilmente risolve il tuo problema.

http://www.codeofaninja.com/2013/09/android-viewholder-pattern-example.html

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Problema listview checkbox
« Risposta #6 il: 08 Luglio 2014, 18:37:13 CEST »
0
Proverò, in tanto grazie appena risolvo chiudo il post....


Post unito: 09 Luglio 2014, 09:15:37 CEST
Nulla da fare anche implementando il pattern ViewHolder ho lo stesso identico  problema.

« Ultima modifica: 09 Luglio 2014, 09:15:37 CEST da ignaz, Reason: Merged DoublePost »

iClaude

  • Visitatore
Re:Problema listview checkbox
« Risposta #7 il: 09 Luglio 2014, 10:54:11 CEST »
0
È un problema di recycling delle View della ListView e dei relativi listener.
Qua dovresti trovare una soluzione (devi anche guardare il quesito precedente linkato)...

list - Android listview with checkbox problem - Stack Overflow

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Problema listview checkbox
« Risposta #8 il: 11 Luglio 2014, 16:07:11 CEST »
0
Nulla da fare ho provato tutte le soluzioni consigliate ma nulla da fare!
Sempre lo stesso comportamento.
Ho provato anche diversi tutorial come questo
Android ListView Checkbox Example - OnItemClickListener() and OnClickListener()


ma non funziona ogni volta che seleziono un elemento mi viene checcato quello e uno a dieci posizioni più in basso.
E' strano , Solo a me succede questo?

Sono anche partito da zero con un progetto vuoto.

iClaude

  • Visitatore
Re:Problema listview checkbox
« Risposta #9 il: 11 Luglio 2014, 16:14:32 CEST »
0
Posta il nuovo codice dell'adapter...

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Problema listview checkbox
« Risposta #10 il: 14 Luglio 2014, 11:42:11 CEST »
0
Ecco il mio codice, anche senza gestire l'evento sul check ho lo stesso problema.



Codice (Java): [Seleziona]
String[] campi = {"titolo","autore","link","immagine"};
                int[] controlli = {R.id.checkedTextRicetta,R.id.txt_r_online_autore,0,0};                              
                SimpleAdapter adapt = new SimpleAdapter(getBaseContext(),data,R.layout.riga_ricetteonline, campi,controlli){

                        @Override
                        public View getView(final int position, View convertView,
                                        ViewGroup parent) {
                               
                                myItem item;
                               
                                if (convertView == null){
                                       
                                         LayoutInflater inflater = getLayoutInflater();
                                        convertView = inflater.inflate(R.layout.riga_ricetteonline, parent, false);
                                        item = new myItem();
                                        item.check = (CheckBox)convertView.findViewById(R.id.checkedTextRicetta);
                                        item.autore = (TextView)convertView.findViewById(R.id.txt_r_online_autore);                                    
                                                HashMap<String,Object> data = (HashMap<String,Object>)getItem(position);
                                           
                                        item.check.setTag(data.get("link").toString());
                                        item.autore.setText(data.get("autore").toString());    
                                       
        //                              item.check.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                                                       
//                                                      @Override
//                                                      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//                                                              // TODO Auto-generated method stub
//                                                               int pos = lista.getPositionForView(buttonView);
//                                                       System.out.println("Pos ["+pos+"]");
//                                                               
//                                                     
//                                                      }
//                                              });
                                       
                                        // store the holder with the view.
                                        convertView.setTag(item);
                                       
                                }else{
                                        item = (myItem)convertView.getTag();
                                       
                                }
                               
                             
//                              item.check.setOnClickListener(new OnClickListener() {
//                                             
//                                              @Override
//                                              public void onClick(View v) {
//                                                      // TODO Auto-generated method stub
//                                                      //item.check.setChecked(true);
//                                                     
//                                                      CheckBox c = (CheckBox)v;
//                                                      if (c.isChecked()){
//                                                             
//                                                              item.check.setChecked(true);
//                                                      }else{
//                                                             
//                                                              item.check.setChecked(false);
//                                                      }
//                                                     
//                                                     
//                                              }
//                                      });
                               
                               
                                                                                         
                           
                               
                           
                           
                            return convertView;
                               
//                                                                                                                           
                       
                        }
                       
                       
                };
               
               
                lista.setAdapter(adapt);

iClaude

  • Visitatore
Re:Problema listview checkbox
« Risposta #11 il: 16 Luglio 2014, 10:28:22 CEST »
0
Nei link di Stackoverflow che ho postato trovi la soluzione.
In pratica:
- tenere un array x memorizzare lo stato di ogni checkbox
- ricordarsi di chiamare setChecked solo dopo aver impostato il listener, altrimenti chiama il vecchio listener riciclato.

Dal tuo codice non mi pare che hai seguito questi suggerimenti...

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Problema listview checkbox
« Risposta #12 il: 18 Luglio 2014, 09:15:40 CEST »
0
Nei link di Stackoverflow che ho postato trovi la soluzione.
In pratica:
- tenere un array x memorizzare lo stato di ogni checkbox
- ricordarsi di chiamare setChecked solo dopo aver impostato il listener, altrimenti chiama il vecchio listener riciclato.

Dal tuo codice non mi pare che hai seguito questi suggerimenti...

Nel mio codice non chiamo neanche il listner e il problema si presenta lo stesso come se fosse un baco del controllo.
non capisco cosa intendi chiamare setchecked dopo il listener come non si capisce dagli esempi di stackoverflow.
Se chiamo setchecked da dentro il listner stesso problema se lo chiamo dopo, viene eseguito ad ogni riga quindi ?
Anche se non chiamo per niente setchecked  ho lo stesso problema.


iClaude

  • Visitatore
Re:Problema listview checkbox
« Risposta #13 il: 18 Luglio 2014, 10:09:41 CEST »
0
Il problema si presenta perché viene riciclata la View con i relativi listener di default.
Devi creare un array dove memorizzi lo stato (checked o unchecked) di ogni elemento della ListView. Poi in getView usi questo array per impostare lo stato del CheckBox associato a quella View  chiamando setChecked (true o false).

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Problema listview checkbox
« Risposta #14 il: 18 Luglio 2014, 17:19:49 CEST »
0
Il problema si presenta perché viene riciclata la View con i relativi listener di default.
Devi creare un array dove memorizzi lo stato (checked o unchecked) di ogni elemento della ListView. Poi in getView usi questo array per impostare lo stato del CheckBox associato a quella View  chiamando setChecked (true o false).

Ti ringrazio per la tua disponibilità ma non riesco a risolvere
ho fatto così ma va in errore quando scorro la lista per un nullo ma non capisco dove va in  errore.

Codice (Java): [Seleziona]
        if (convertView == null){
                                       
                                         LayoutInflater inflater = getLayoutInflater();
                                        convertView = inflater.inflate(R.layout.riga_ricetteonline, parent, false);
                                        item = new myItem();
                                        item.check = (CheckBox)convertView.findViewById(R.id.checkedTextRicetta);
                                        item.autore = (TextView)convertView.findViewById(R.id.txt_r_online_autore);                                    
                                                HashMap<String,Object> data = (HashMap<String,Object>)getItem(position);
                                           
                                        item.check.setTag(data.get("link").toString());
                                        item.autore.setText(data.get("autore").toString());    
                                       
                                        item.check.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                                                       
                                                        @Override
                                                        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                                                                // TODO Auto-generated method stub
                                                                 int pos = lista.getPositionForView(buttonView);
                                                         System.out.println("Pos ["+pos+"]");
                                                             if (isChecked){
                                                                 listaValori.add(pos,true);
                                                                 
                                                             }else{
                                                                 listaValori.add(pos,false);
                                                                 
                                                             }
                                                             
                                                        }
                                                       
                                                });
                                                                               
                                        // store the holder with the view.
                                        convertView.setTag(item);
                                       
                                }else{
                                        item = (myItem)convertView.getTag();                           
                                }
                               
                               
                                        item.check.setChecked(listaValori.get(position));
                               
                             
                         
                           
                            return convertView;

questo il logcat
Codice: [Seleziona]

07-18 17:09:31.193: E/AndroidRuntime(3655): FATAL EXCEPTION: main
07-18 17:09:31.193: E/AndroidRuntime(3655): Process: com.example.testchecbox, PID: 3655
07-18 17:09:31.193: E/AndroidRuntime(3655): java.lang.NullPointerException
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.widget.AdapterView.getPositionForView(AdapterView.java:598)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at com.example.testchecbox.MainActivity$1$1.onCheckedChanged(MainActivity.java:88)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.widget.CompoundButton.setChecked(CompoundButton.java:127)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at com.example.testchecbox.MainActivity$1.getView(MainActivity.java:108)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.widget.AbsListView.obtainView(AbsListView.java:2255)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.widget.ListView.makeAndAddView(ListView.java:1790)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.widget.ListView.fillDown(ListView.java:691)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.widget.ListView.fillGap(ListView.java:655)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5143)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4254)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.view.Choreographer.doCallbacks(Choreographer.java:574)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.view.Choreographer.doFrame(Choreographer.java:543)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.os.Handler.handleCallback(Handler.java:733)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.os.Handler.dispatchMessage(Handler.java:95)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.os.Looper.loop(Looper.java:136)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at android.app.ActivityThread.main(ActivityThread.java:5001)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at java.lang.reflect.Method.invokeNative(Native Method)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at java.lang.reflect.Method.invoke(Method.java:515)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
07-18 17:09:31.193: E/AndroidRuntime(3655):         at dalvik.system.NativeStart.main(Native Method)