2013-03-05 3 views
0

J'ai essayé de choisir les contacts API dans android. Cela fonctionne très bien quand j'utilise la méthode suivante (CONTENT_URI):contacts y compris l'option de recherche en android

  • Mais je ne peux pas obtenir une option de recherche à l'intérieur des contacts API.Kindly peut-on partager l'information que vous know.thanks ..

code ici

public void onActivityResult(int reqCode, int resultCode, Intent data) { 
super.onActivityResult(reqCode, resultCode, data); 

switch (reqCode) { 
case (PICK_CONTACT) : 
    if (resultCode == Activity.RESULT_OK) { 

    Uri contactData = data.getData(); 
    Cursor c = managedQuery(contactData, null, null, null, null); 
    if (c.moveToFirst()) { 


     String id =c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID)); 

     String hasPhone =c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 

      if (hasPhone.equalsIgnoreCase("1")) { 
      Cursor phones = getContentResolver().query( 
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id, 
         null, null); 
      phones.moveToFirst(); 
      cNumber = phones.getString(phones.getColumnIndex("data1")); 

      System.out.println("number is:"+cNumber); 
      } 
     /*name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

     Textcontact.setText(name);*/ 

     edt.setText(cNumber); 

    } 
    } 
    break; 
} 
} 

Note: J'ai besoin d'une fonctionnalités comme les contacts android rechercher

+1

vous n'avez pas besoin d'utiliser 'equalsIgnoreCase' lorsque l'on compare avec' '1' juste equals' va faire la même chose. –

Répondre

2

Vous devrez create a search interface. D'abord, vous devez créer une mise en page XML qui a à la fois un EditText et un ListView.

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

<!-- Pretty hint text, and maxLines --> 
<EditText android:id="@+building_list/search_box" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:hint="type to filter" 
    android:inputType="text" 
    android:maxLines="1"/> 

<!-- Set height to 0, and let the weight param expand it --> 
<!-- Note the use of the default ID! This lets us use a 
    ListActivity still! --> 
<ListView android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1" 
    /> 

</LinearLayout> 

Cela va tout geler correctement, avec un bon EditText au-dessus de la ListView. Ensuite, créez une ListActivity comme vous le feriez normalement, mais ajoutez un appel à setContentView() dans la méthode onCreate() afin que nous utilisions notre disposition récemment déclarée. Rappelez-vous que nous avons identifié le ListView spécialement, avec android: id = "@ android: id/list". Cela permet à ListActivity de savoir quelle ListView nous voulons utiliser dans notre présentation déclarée.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.filterable_listview); 

    setListAdapter(new ArrayAdapter<String>(this, 
        android.R.layout.simple_list_item_1, 
        getStringArrayList()); 
} 

Exécution de l'app devrait montrer votre ListView précédente, avec une jolie boîte ci-dessus. Pour que cette boîte fasse quelque chose, nous devons en prendre l'entrée et faire en sorte que cette entrée filtre la liste. Bien que beaucoup de personnes aient essayé de le faire manuellement, la plupart des classes de l'adaptateur ListView sont livrées avec un objet Filter qui peut être utilisé pour effectuer le filtrage automatiquement. Nous avons juste besoin de canaliser l'entrée de l'EditText dans le filtre. Il s'avère que c'est assez facile. Pour exécuter un test rapide, ajoutez cette ligne à votre onCreate() appelle

adapter.getFilter().filter(s); 

Notez que vous devrez enregistrer votre ListAdapter à une variable pour faire ce travail - je l'ai sauvé ArrayAdapter de plus tôt dans une variable appelée 'adaptateur'.

L'étape suivante consiste à obtenir l'entrée de EditText. Cela nécessite un peu de réflexion. Vous pouvez ajouter un OnKeyListener() à votre EditText. Cependant, cet écouteur ne reçoit que des événements clés. Par exemple, si un utilisateur entre «wyw», le texte prédictif recommandera probablement «œil». Tant que l'utilisateur n'a pas choisi 'wyw' ou 'eye', votre OnKeyListener ne recevra pas d'événement clé. Certains peuvent préférer cette solution, mais j'ai trouvé cela frustrant. Je voulais tous les événements clés, j'ai donc eu le choix de filtrer ou de ne pas filtrer. La solution est un TextWatcher. Il suffit de créer et d'ajouter un TextWatcher à l'EditText, et de passer le filtre ListAdapter une demande de filtre chaque fois que le texte change. N'oubliez pas de supprimer le TextWatcher dans OnDestroy()! Voici la solution finale:

private EditText filterText = null; 
ArrayAdapter<String> adapter = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.filterable_listview); 

    filterText = (EditText) findViewById(R.id.search_box); 
    filterText.addTextChangedListener(filterTextWatcher); 

    setListAdapter(new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, 
       getStringArrayList()); 
} 

private TextWatcher filterTextWatcher = new TextWatcher() { 

public void afterTextChanged(Editable s) { 
} 

public void beforeTextChanged(CharSequence s, int start, int count, 
     int after) { 
} 

public void onTextChanged(CharSequence s, int start, int before, 
     int count) { 
    adapter.getFilter().filter(s); 
} 

}; 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    filterText.removeTextChangedListener(filterTextWatcher); 
} 
Questions connexes