Autore Topic: Selezione multipla in una listview  (Letto 715 volte)

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
Selezione multipla in una listview
« il: 02 Aprile 2015, 18:31:37 CEST »
0
Ho creato una listview che contiene un numero variabile di oggetti. Per cancellare un elemento baste cliccarci sopra (questo cambia colore) e completare l'azione con il taso cancel appositamente creato.
In realtà dopo aver selezionato un elemento da cancellare, scorrendo la listview verso il basso per visualizzare gli altri elementi nascosti, mi sono accorto che anche un'altro elemento della lista è stato selezionato senza un apparente motivo....???

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Selezione multipla in una listview
« Risposta #1 il: 03 Aprile 2015, 08:48:17 CEST »
0
E' capitato anche a me, con molti elementi selezionandone uno viene selezionato anche un altro elemento corrispondente alla posizione del primo +6 (se non ricordo male), l'unica soluzione è stata utilizzare simple_list_item_multiple_choice per gli item, però compare anche la checkbox.
Se la mia risposta ti è utile, per favore un thanks!

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Selezione multipla in una listview
« Risposta #2 il: 03 Aprile 2015, 10:43:24 CEST »
0
Io ho risolto sistemando un po l' adapter.
Avevo alcuni if else per settore un colore ad una view. Quando arrivo a casa posto il codice. Non facevo uso di checkbox

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
Re:Selezione multipla in una listview
« Risposta #3 il: 03 Aprile 2015, 10:52:51 CEST »
0
Esatto....per la precisione in un display da 5" viene selezionato anche l'elemento corrispondente alla posizione del primo +6, mentre in un 4" alla posizione del primo +5.....dipende quindi dalla grandezza del display...e chissà da quali altri fattori!!
In realtà la mia listview viene caricata con un cursoradapter che preleva i dati da un database, quindi non so se sia possibile utilizzare una simple_list_item_multiple_choice ....vediamo cosa si può fare.



Post unito: 03 Aprile 2015, 10:58:04 CEST
Io le ho provate tutte! (o quasi), if else, cicli di tutti i tipi, ecc... ho anche recuperato il riferimento specifico di ogni posizione della lista per gestire indipendentemente ogni item, ma niente!!.....è come se l'adapter o non so chi, attribuisse lo stesso riferimento ogni 5 o 6 elementi della lista.
« Ultima modifica: 03 Aprile 2015, 10:58:04 CEST da Friz02, Reason: Merged DoublePost »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Selezione multipla in una listview
« Risposta #4 il: 03 Aprile 2015, 10:58:43 CEST »
0
Usi il pattern view holder vero? È normale che dia sto problema.

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Selezione multipla in una listview
« Risposta #5 il: 03 Aprile 2015, 11:28:19 CEST »
0
Esatto....per la precisione in un display da 5" viene selezionato anche l'elemento corrispondente alla posizione del primo +6, mentre in un 4" alla posizione del primo +5.....dipende quindi dalla grandezza del display...e chissà da quali altri fattori!!
In realtà la mia listview viene caricata con un cursoradapter che preleva i dati da un database, quindi non so se sia possibile utilizzare una simple_list_item_multiple_choice ....vediamo cosa si può fare.

Il problema è indipendente, io da un array di stringhe, usando:
Codice: [Seleziona]
adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,elencoapp);Però il layout del multiple_choice di default prevede il checkbox, ma risolve il problema della selezione, si potrebbe provare a nasconderlo se da fastidio.
Se la mia risposta ti è utile, per favore un thanks!

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
Re:Selezione multipla in una listview
« Risposta #6 il: 03 Aprile 2015, 11:31:26 CEST »
0
Sinceramente no....ciò per trovare i riferimenti uso findViewById(), LayoutInflater.....è questo che intendi?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Selezione multipla in una listview
« Risposta #7 il: 03 Aprile 2015, 11:53:57 CEST »
0
questo è un mio pezzo di codice che non ha il problema da te riscontrato

Codice (Java): [Seleziona]
 @Override
    public View getView(int position,View convertView, ViewGroup parent) {

        final MyFile file = getItem(position);
        ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(resource, parent, false);
            holder.imgRowIcon = ((ImageView) convertView.findViewById(R.id.imgRowIcon));
            holder.tvRowName = (TextView) convertView.findViewById(R.id.tvRowName);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.tvRowName.setText(file.getName()+file.getNumberChild());

        // LOAD ASYNK IMAGE CACHED IN LRU-CACHE
        if(file.isImage())  loadBitmap(holder.imgRowIcon,file.getFile().getPath());
        else                holder.imgRowIcon.setImageResource(getResourceId(file.getExtensionImage()));

        // HIDDEN FILE
        if(file.isHidden()) convertView.setAlpha(0.4f);
        else                convertView.setAlpha(1f);

        // SELECTED FILE
        if(file.isSelected()) convertView.setBackgroundColor(mContext.getResources().getColor(R.color.LightGreen));
        else                  convertView.setBackgroundColor(mContext.getResources().getColor(android.R.color.transparent));

        return convertView;
    }

    private static class ViewHolder {
        private TextView tvRowName;
        private ImageView imgRowIcon;

    }

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
Re:Selezione multipla in una listview
« Risposta #8 il: 03 Aprile 2015, 12:10:40 CEST »
0
Effettivamente, leggendo un po' in giro, l'unico modo per risolvere questo problema mantenendo la classica listview senza checkbox, ..multiple_choice..., è utilizzare il pattern view holder.
Io però uso un CursorAdapter e non ho modo di riscrive il metodo getView() e utilizzare la classe ViewHolder......almeno credo.

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Selezione multipla in una listview
« Risposta #9 il: 03 Aprile 2015, 12:22:33 CEST »
0
Puoi crearti un custom cursor adapter e quindi metterci il layout che vuoi per ogni item.
Se la mia risposta ti è utile, per favore un thanks!

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
Re:Selezione multipla in una listview
« Risposta #10 il: 03 Aprile 2015, 12:46:48 CEST »
0
In realtàil mio  cursor adapter è gia custom, quindi, presumo, devo solo inserire la parte del ViewHolder....adesso studio il codice di tonno16.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Selezione multipla in una listview
« Risposta #11 il: 03 Aprile 2015, 12:48:28 CEST »
0
Aspetta. Quel problema è dato dall'utilizzo del viewholder. Se per esempio dovessi inizializzare le varie texview etc senza fare .setTag() il problema dovrebbe comunque scomparire ma a discapito delle prestazioni

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
Re:Selezione multipla in una listview
« Risposta #12 il: 03 Aprile 2015, 14:47:37 CEST »
0
Aspetta, io credevo che proprio l'utilizzo del viewholder fosse la soluzione al mio problema....quindi non dovrei far niente di tutto ciò....questo è il mio cursor adapter, le textview sono state inizializzate ......ma il problema è rimasto, non mi capisco più.
Codice (Java): [Seleziona]
cursorAdapter = new CursorAdapter(this, dbManager.getProject(), false) {
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
                View v=LayoutInflater.from(context).inflate(R.layout.activity_main_vediprogetti,null);
                return v;
            }
            @Override
            public void bindView(View view, Context context, Cursor cursor) {
                TextView txtFigura = (TextView) view.findViewById(R.id.figura);
                TextView txtTitolo = (TextView) view.findViewById(R.id.titolo);
                TextView txtFormule = (TextView) view.findViewById(R.id.formule);
                TextView txtRaggio = (TextView) view.findViewById(R.id.raggio);
                TextView txtAltezza = (TextView) view.findViewById(R.id.altezza);
                TextView txtVolume = (TextView) view.findViewById(R.id.volume);
                TextView txtSuperficie = (TextView) view.findViewById(R.id.superficie);

                txtFigura.setText(cursor.getString(cursor.getColumnIndex("figura")));
                txtTitolo.setText((getString(R.string.nome_progetto_dialog_salva))+" "+cursor.getString(cursor.getColumnIndex("name")));
                txtFormule.setText(getString(R.string.text_formule)+" "+cursor.getString(cursor.getColumnIndex("formule")));
                txtRaggio.setText(getString(R.string.text_raggio)+" "+cursor.getString(cursor.getColumnIndex("raggio")));
                txtAltezza.setText(getString(R.string.text_altezza)+" "+cursor.getString(cursor.getColumnIndex("altezza")));
                txtVolume.setText(getString(R.string.calcola_volume)+": "+cursor.getString(cursor.getColumnIndex("volume")));
                txtSuperficie.setText(getString(R.string.calcola_superficie)+": "+cursor.getString(cursor.getColumnIndex("superficie")));

            }
        };
        ListView listView = (ListView)findViewById(R.id.listViewSave);    
        listView.setAdapter(cursorAdapter);



Post unito: 03 Aprile 2015, 19:21:54 CEST
In ogni caso quello che serve a me credo sia
Citazione
Codice (Java): [Seleziona]
// HIDDEN FILE
        if(file.isHidden()) convertView.setAlpha(0.4f);
        else                convertView.setAlpha(1f);
ma come ottieni il riferimento "file"?

Se faccio
Codice (Java): [Seleziona]
File file = getItem(position); mi da errore anche se faccio il casting.
« Ultima modifica: 03 Aprile 2015, 19:21:54 CEST da Friz02, Reason: Merged DoublePost »