2011-12-11 99 views
2

我需要阅读我的android应用程序中的联系人列表,并显示给用户一个多选的选项。 我刚刚看到了与ListView.CHOICE_MODE_MULTIPLE的Android示例,但我需要不同的东西,我想要一个custm布局。 我需要显示bot的名称和联系人的号码,所以我创建了我自己的适配器。所有的 首先我做了myown类来创建一个联系人:Android - 多选择自定义适配器listview

//Contacts class 
public class Contatto { 


    private String nome; //The name 
    private String numero;//number 

    public String getNome(){ //Get Name 
     return nome; 
    } 

    public String getNumero(){ //Get number 
     return numero; 
    } 

    public void setNome(String n){ //Set name 
     this.nome = n; 
    } 

    public void setNumero(String n){ //Set number 
     this.numero = n; 
    } 

} 

然后我用cicle使用一个线程来通知应用程序正在用户把所有的contatcs ...

import java.util.ArrayList; 

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(); 
} 
} 

这是简单的XML布局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
> 
    <ListView 
     android:id="@+id/android:list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     ></ListView> 

</LinearLayout> 

这项工作,但是当我运行应用程序,如果我检查那么第一个结果页面滚动也是第一个结果在新的页面被选中,等等......你能帮我理解为什么吗?

回答

1

我之前面临过这样的问题,下面是我发现它的原因。

由于列表视图使用视图对象回收来节省内存,我们需要某种机制来存储每个列表项的选择状态,然后在get view方法中使用它来检查或取消选择(imp)选择当检索视图时。

我希望它能帮助

+0

这可能会帮助你实现[与复选框列表视图(http://windrealm.org/tutorials/android/listview-with-checkboxes-without-listactivity.php) –

相关问题