2017-04-17 2 views
0

Je montre la liste des contacts de la table de contact, mais pas en mesure d'obtenir le numéro de téléphone en utilisant le même sur le code RecyclerView.My est -Afficher le contact du contact chargeur Directeur

package com.oodles.oodlesapprtc; 

import android.annotation.SuppressLint; 
import android.app.LoaderManager; 
import android.content.CursorLoader; 
import android.content.Intent; 
import android.content.Loader; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.DefaultItemAnimator; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 


import java.util.ArrayList; 

/** 
* Created by ankita on 13/4/17. 
*/ 

public class LoginUserActivity extends AppCompatActivity { 
    public static final int CONTACT_LOADER_ID = 78; 
    RecyclerView loginUserRecycler; 
    ArrayList<ContactBeans> contactBeanses; 
    String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + 
      " COLLATE LOCALIZED ASC"; 
    private static final String[] PROJECTION2 = { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, ContactsContract.Contacts.PHOTO_URI,ContactsContract.Contacts.HAS_PHONE_NUMBER 
    }; 
    private static final String[] PROJECTION3 = { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, ContactsContract.Contacts.PHOTO_URI, ContactsContract.Contacts.LOOKUP_KEY 
    }; 
    private static final String[] PROJECTION = { 
      ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY, ContactsContract.CommonDataKinds.Phone.NUMBER 
    }; 
// private static final String[] PROJECTION1 = { 
//   ContactsContract.Data.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY, 
//   ContactsContract.CommonDataKinds.Phone.NUMBER 
// }; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login_user_activity); 
     initViews(); 
    } 

    private void initViews() { 
     getLoaderManager().initLoader(0, null, contactLoaderManager); 
     initRecycler(); 

    } 


    private void initRecycler() { 
     loginUserRecycler = (RecyclerView) findViewById(R.id.loginUserRecycler); 
     loginUserRecycler.setLayoutManager(new LinearLayoutManager(this)); 
     loginUserRecycler.setItemAnimator(new DefaultItemAnimator()); 
    } 


    LoaderManager.LoaderCallbacks<Cursor> contactLoaderManager = new LoaderManager.LoaderCallbacks<Cursor>() { 
     @Override 
     public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
//   String[] projectionFields = new String[]{ContactsContract.Contacts._ID, 
//     ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.PhoneLookup.NORMALIZED_NUMBER, 
//     ContactsContract.Contacts.PHOTO_URI}; 
      // Construct the loader 
//   Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
//   ContactsContract.Contacts.CONTENT_URI 
//   Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 
//     Uri.encode(phoneNumber)); 
      CursorLoader cursorLoader = new CursorLoader(LoginUserActivity.this, 
        ContactsContract.Contacts.CONTENT_URI, // URI 
        PROJECTION2, // projection fields 
        null, // the selection criteria 
        null, // the selection args 
        sortOrder // the sort order 
      ); 
      return cursorLoader; 
     } 

     @Override 
     public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
      loginUserRecycler.setAdapter(new CursorRecyclerAdapter(LoginUserActivity.this, data)); 
     } 

     @Override 
     public void onLoaderReset(Loader<Cursor> loader) { 

     } 
    }; 
} 

Mon adaptateur est -

package com.oodles.oodlesapprtc; 

import android.content.ContentUris; 
import android.content.Context; 
import android.database.Cursor; 
import android.net.Uri; 
import android.provider.ContactsContract; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

/** 
* Created by ankita on 13/4/17. 
*/ 

public class CursorRecyclerAdapter extends RecyclerView.Adapter<ContactViewHolder> { 

    private Cursor mCursor; 
    private final int mNameColIdx, 
      mIdColIdx; 
    int phoneNumber; 
    int hasPhoneNumber; 
    private Context mContext; 


    public CursorRecyclerAdapter(Context context, Cursor cursor) { 
     mCursor = cursor; 
     this.mContext = context; 
     mNameColIdx = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY); 
     mIdColIdx = cursor.getColumnIndex(ContactsContract.Contacts._ID); 
     hasPhoneNumber = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER); 
    } 




    @Override 
    public ContactViewHolder onCreateViewHolder(ViewGroup parent, int pos) { 
     View listItemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.contact_row, parent, false); 
     return new ContactViewHolder(listItemView); 
    } 

    @Override 
    public void onBindViewHolder(ContactViewHolder contactViewHolder, int pos) { 
     mCursor.moveToPosition(pos); 
     String contactName = mCursor.getString(mNameColIdx); 
     long contactId = mCursor.getLong(mIdColIdx); 
     Contact c = new Contact(); 
     Log.e("ddhdhdhhdhdhdhd",hasPhoneNumber+""); 
     c.name = contactName; 
     c.number = getPhoneNumberFromContactId(contactId); 
     c.profilePic = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); 
     getPhoneNumberFromContactId(contactId); 
     contactViewHolder.bind(c); 
    } 

    private String getPhoneNumberFromContactId(long contactId) { 
     String contactNumber = "8874675724"; 


     return contactNumber; 
    } 

    @Override 
    public int getItemCount() { 
     return mCursor.getCount(); 
    } 
} 

Comment puis-je obtenir le numéro de téléphone pour le même je reçois une exception cursorindexoutofbound et a le numéro de téléphone valeur 3, mais il ne peut être que 0 ou 1 pourquoi il est 3 je ne comprends pas cela. Quelqu'un peut-il s'il vous plaît me expliquer cela aussi s'il vous plaît expliquer comment les travaux

chercher le contact

Répondre

0

Vous avez quelques problèmes dans le code:

  1. Vous vous interrogez sur la table Contacts, mais le tri en utilisant une table CommonDataKinds.Phone champ, ce n'est pas bon, vous pouvez trier en utilisant Contacts.DISPLAY_NAME_PRIMARY à la place.
  2. cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER) vous donne un indice de colonne, et non la valeur du champ, c'est la raison pour laquelle vous obtenez 3 (c'est le champ défini dans 4ième PROJECTION2), changer hasPhoneNumber-mHasPhoneNumberIdx pour éviter toute confusion.
  3. ajoutez hasPhoneNumber = mCursor.getInt(mHasPhoneNumberIdx); à votre méthode onBindViewHolder, pour obtenir la valeur réelle.
  4. Exécuter une commande longue comme une implémentation réelle de getPhoneNumberFromContactId dans onBindViewHolder est vraiment mauvais ... vous devriez changer votre requête principale pour que vous fassiez deux grosses requêtes, une pour tous les contacts, une pour tous les téléphones, puis utilisez un peu de HashMap pour obtenir un téléphone en utilisant un contact-id.