Autore Topic: ListView con custom ArrayAdapter. Come accedere e gestire i dati?  (Letto 1472 volte)

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
0
Ciao a tutti, avrei bisogno di un aiuto per risolvere un problema.

Seguendo questo tutorial [medio] ListView con layout personalizzato tramite un custom ArrayAdapter - Android Developers Italia ho implementato la mia listview.
Ora vorrei aggiungere ad ogni riga un checkbutton o un radiobutton a seconda di quello che mi serve.
Riesco ad aggiungerlo facilmente ma non riesco a gestirlo come vorrei.
La mia classe Answer, che sarebbe l'equivalente di Person ha un campo boolean che a seconda dell'esigenza vorrei settare a true o false quando cliccato oppure no.

Come posso fare a gestire questo evento? Io usando un semplicissimo onItemClick posso stampare a video un toast così per prova, ma vorrei accedere al mio oggetto Answer e settare il suo campo boolean.

Grazie per l'attenzione


Questo è il mio ArrayAdapter
Codice (Java): [Seleziona]
public class MyAnswerArrayAdapterRadio extends ArrayAdapter<Answer> {

        private final ArrayList<Answer> list;
        private final Activity context;

        public MyAnswerArrayAdapterRadio(Activity context, ArrayList<Answer> list) {
                super(context, R.layout.answer_itemr, list);
                this.context = context;
                this.list = list;
        }

        static class ViewHolder {
                protected TextView text;
                protected CheckBox checkbox;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                View view = null;
                if (convertView == null) {
                        LayoutInflater inflator = context.getLayoutInflater();
                        view = inflator.inflate(R.layout.answer_item, null);
                        final ViewHolder viewHolder = new ViewHolder();
                        viewHolder.text = (TextView) view.findViewById(R.id.answerName);
                        viewHolder.checkbox = (CheckBox) view.findViewById(R.id.checkAnsw);
                        view.setTag(viewHolder);
                        viewHolder.checkbox.setTag(list.get(position));
                } else {
                        view = convertView;
                        ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
                }
                ViewHolder holder = (ViewHolder) view.getTag();
                holder.text.setText(list.get(position).getAnswer_option());
                holder.checkbox.setChecked(list.get(position).isSelected());
                return view;
        }
}

Questo pezzo è per richiamarlo nella mia activity (che ho esteso a ListActivity)
Codice (Java): [Seleziona]
MyAnswerArrayAdapterRadio adapter = new MyAnswerArrayAdapterRadio(this,answerList);
setListAdapter(adapter);

Questa è la mia classe (ci sono i relativi set e get che ometto per non scrivere un post troppo lungo)

Codice (Java): [Seleziona]
public class Answer {

        private int answer_id;
        private String answer_option;
        private boolean selected;
« Ultima modifica: 22 Febbraio 2012, 18:07:56 CET da Mr.Donut »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListView con custom ArrayAdapter. Come accedere e gestire i dati?
« Risposta #1 il: 22 Febbraio 2012, 19:03:29 CET »
0
Come posso fare a gestire questo evento? Io usando un semplicissimo onItemClick posso stampare a video un toast così per prova, ma vorrei accedere al mio oggetto Answer e settare il suo campo boolean.

Nell'onItemClick ti viene passata la posizione cliccata, che corrisponde alla posizione dell'elemento nell'ArrayList ;)

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:ListView con custom ArrayAdapter. Come accedere e gestire i dati?
« Risposta #2 il: 22 Febbraio 2012, 19:45:05 CET »
0
Nell'onItemClick ti viene passata la posizione cliccata, che corrisponde alla posizione dell'elemento nell'ArrayList ;)

Effettivamente dicono la stessa cosa le api ma non riesco ad accedervi e non capisco il perché! Non ha senso :s

Codice (Java): [Seleziona]
protected void onListItemClick(ListView l, View v, int position, long id) {
                Answer item = (Answer) getListAdapter().getItem(position);
                Toast.makeText(this, item.getAnswer_option() + " selected", Toast.LENGTH_LONG).show();

        }

Mi crasha durante l'esecuzione...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
R: ListView con custom ArrayAdapter. Come accedere e gestire i dati?
« Risposta #3 il: 22 Febbraio 2012, 20:13:30 CET »
0
Cosa dice il logcat?

Inviato dal mio HTC Desire usando Tapatalk

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:R: ListView con custom ArrayAdapter. Come accedere e gestire i dati?
« Risposta #4 il: 22 Febbraio 2012, 20:41:17 CET »
0
Cosa dice il logcat?

Inviato dal mio HTC Desire usando Tapatalk

Non so per quale assurdo motivo adesso non crasha più, però non mi lancia nemmeno più i toast.... Cerco di rimetterlo come prima e poi te lo faccio vedere.

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:ListView con custom ArrayAdapter. Come accedere e gestire i dati?
« Risposta #5 il: 22 Febbraio 2012, 20:47:15 CET »
0
Mi sta sorgendo un dubbio... Ma il metodo per gestire l'evento del click su ogni riga lo devo creare nell'activity oppure nell'ArrayAdapter?

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:ListView con custom ArrayAdapter. Come accedere e gestire i dati?
« Risposta #6 il: 22 Febbraio 2012, 21:20:06 CET »
0
Ho trovato per caso googlando questo tutorial ListView Example 4 - Custom Layout Checkbox, Image, TextView e FINALMENTE comincio a capire bene l'argomento delle dannate view. Spero possa servire a qualcuno anche se seriamente andrebbe pulito un pochino.

EDIT
Sono dovuto ritornare alla versione iniziale perché non riuscivo più a fare niente come si deve...

Cosa dice il logcat?

Inviato dal mio HTC Desire usando Tapatalk

Questo è il log cat
Codice (Java): [Seleziona]
02-22 21:11:41.240: E/AndroidRuntime(1199): FATAL EXCEPTION: main
02-22 21:11:41.240: E/AndroidRuntime(1199): java.lang.ClassCastException: java.lang.String
02-22 21:11:41.240: E/AndroidRuntime(1199):     at com.android.AnswerActivity.onListItemClick(AnswerActivity.java:93)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at android.app.ListActivity$2.onItemClick(ListActivity.java:319)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at android.widget.ListView.performItemClick(ListView.java:3513)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at android.os.Handler.handleCallback(Handler.java:587)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at android.os.Looper.loop(Looper.java:123)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at android.app.ActivityThread.main(ActivityThread.java:3683)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at java.lang.reflect.Method.invokeNative(Native Method)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at java.lang.reflect.Method.invoke(Method.java:507)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-22 21:11:41.240: E/AndroidRuntime(1199):     at dalvik.system.NativeStart.main(Native Method)

EDIT2

Porca miseria ho capito adesso.... Per fare delle prove più semplici avevo usato un ArrayAdapter<String> e giustamente quando restituivo un object di tipo Answer quello crashava...
Scusate il disturbo e chiudete pure il topic >__<
« Ultima modifica: 22 Febbraio 2012, 22:22:31 CET da Mr.Donut »