Autore Topic: Listview e scelta multipla (multiple choice)  (Letto 954 volte)

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Listview e scelta multipla (multiple choice)
« il: 01 Ottobre 2011, 19:20:47 CEST »
0
Caio a tutti,
ho la necessità di creare una listview utilizzando un layout custom, ho fatto tutto senza problemi ma quando clicco sul primo lemento la checbox si colora in modo corretto ma se scorro l'elenco verso il basso scopro che anche il primo elemento della nuova pagina appare selezionato  o_O
Sapete dirmi come mai?
Ho provato a guardare l'esempio che c'è nell'sdk e utilizza getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
 cosa che ovviamente per me non è possibile utilizzare...

vi lascio il codice così magari se lo provate capite meglio quale sia il mio problema:

Classe Contatta.java
Codice (Java): [Seleziona]
public class Contatto {
       
        private String nome;
        private String numero;
       
        public String getNome(){
                return nome;
        }
       
        public String getNumero(){
                return numero;
        }
       
        public void setNome(String n){
                this.nome = n;
        }
       
        public void setNumero(String n){
                this.numero = n;
        }
       
}

CustomLayout (Per ogni singola riga):
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:orientation="horizontal"
       >
        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:layout_weight="8"
                android:layout_marginLeft="3dp"
       >
                <TextView              
               android:id="@+id/NomeElenco"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:layout_weight="8"
               android:textSize="15sp"
               android:layout_marginTop="3dp"
               android:textColor="#FFF">
                </TextView>
                <TextView              
               android:id="@+id/NumeroElenco"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:layout_weight="8"
               android:textSize="12sp"
               android:textColor="#FFF">
                </TextView>
        </LinearLayout>
        <CheckBox
                        android:id="@+id/widget31"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                >
                </CheckBox>
       
</LinearLayout>

e infine la mia activity principale:
Codice (Java): [Seleziona]
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class RecuperaRubrica extends ListActivity{
   
    private ProgressDialog m_ProgressDialog = null;
    private ArrayList<Contatto> arrayContatti = null;
    private ContattoAdapter m_adapter;
    private Runnable viewContatti;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recupera_rubrica);
       
        arrayContatti = new ArrayList<Contatto>();
        this.m_adapter = new ContattoAdapter(this, R.layout.riga, arrayContatti);
        setListAdapter(this.m_adapter);
       
        viewContatti = new Runnable(){
            @Override
            public void run() {
                getContatti();
            }
        };
        Thread thread =  new Thread(null, viewContatti, "MagentoBackground");
        thread.start();
        m_ProgressDialog = ProgressDialog.show(RecuperaRubrica.this,    
              "ATTENDI...", "Recupero contatti in corso ...", true);
    }
    private Runnable returnRes = new Runnable() {

        @Override
        public void run() {
            if(arrayContatti != null && arrayContatti.size() > 0){
                m_adapter.notifyDataSetChanged();
                for(int i=0;i<arrayContatti.size();i++)
                m_adapter.add(arrayContatti.get(i));
            }
            m_ProgressDialog.dismiss();
            m_adapter.notifyDataSetChanged();
        }
    };
    private void getContatti(){
          try{
              arrayContatti = new ArrayList<Contatto>();
              Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); //Cursore della rubrica
              while (cursor.moveToNext()) { //Entro nel ciclo se trovo almeno un contatto
                  try{
                        //Recupero tutte le info dell'utente corrente
                  String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                  String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                  String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                 
                  //Se è disponibile almeno un numero di telefono lo recupero
                  if (Integer.parseInt(hasPhone) > 0) {
                      Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null);
                      while (phones.moveToNext()) {
                          String phoneNumber = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));
                         
                          phoneNumber = str_replace("-","",phoneNumber);
                          phoneNumber = str_replace("+39","",phoneNumber);
                         
                          Contatto contatto = new Contatto();
                          contatto.setNome(name.trim());
                          contatto.setNumero(phoneNumber.trim());
                         
                          if(!arrayContatti.contains(contatto)){
                                  arrayContatti.add(contatto);
                          }
                      }
                      phones.close(); //Chiudo la rubrica
                  }
              }catch(Exception e){}
             }
             
            } catch (Exception e) {
              Log.e("BACKGROUND_PROC", e.getMessage());
            }
            runOnUiThread(returnRes);
        }

    private class ContattoAdapter extends ArrayAdapter<Contatto> {

        private ArrayList<Contatto> items;

        public ContattoAdapter(Context context, int textViewResourceId, ArrayList<Contatto> items) {
                super(context, textViewResourceId, items);
                this.items = items;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                if (v == null) {
                    LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.riga, null);
                }
                Contatto o = items.get(position);
                if (o != null) {
                        TextView tt = (TextView) v.findViewById(R.id.NomeElenco);
                        TextView bt = (TextView) v.findViewById(R.id.NumeroElenco);
                        if (tt != null) {
                              tt.setText(o.getNome());                            
                        }
                        if(bt != null){
                              bt.setText(o.getNumero());
                        }
                }
                return v;
        }
    }
   
    public String str_replace (String search, String replace, String subject)
    {
      StringBuffer  result = new StringBuffer (subject);
      int  pos = 0;
      while (true)
      {
        pos = result.indexOf (search, pos);
        if (pos != -1)
          result.replace (pos, pos + search.length (), replace);
        else
          break;
      }
      return result.toString ();
    }
}

come potete vedere ho un CustomAdapter che mi gestisce il tutto
« Ultima modifica: 01 Ottobre 2011, 19:23:02 CEST da ultimoprofeta »

Offline solaris

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One
  • Sistema operativo:
    Windows XP
Re:Listview e scelta multipla (multiple choice)
« Risposta #1 il: 05 Ottobre 2011, 20:31:33 CEST »
0
Scusa una cosa, perchè ad un certo punto notifichi all'adapter che è cambiata la lista PRIMA di aggiungere i contatti alla lista?

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Listview e scelta multipla (multiple choice)
« Risposta #2 il: 11 Dicembre 2011, 15:07:42 CET »
0
Ciao, scusa se rispondo solo adesso ma ho avuto molti problemi...per quanto riguarda all'errore è stata una svista, l'ho eliminato

Nessuno ha idea di dove sbaglio?