显示联系装载程序管理器的联系人

时间:2017-04-17 12:07:58

标签: contacts android-contacts

我正在显示联系人表中的联系人列表,但无法在RecyclerView上使用相同的电话号码。我的代码是 -

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) {

        }
    };
}

我的适配器是 -

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

如何获取相同的电话号码我获得了一个cursorindexoutofbound异常并且电话号码值为3,但它可能只有0或1为什么它是3我不明白这一点。 任何人都可以向我解释这个也请解释联系方式如何工作

1 个答案:

答案 0 :(得分:0)

您在代码中遇到一些问题:

  1. 您在Contacts表上查询,但使用CommonDataKinds.Phone表格字段进行排序,这不是很好,您可以使用Contacts.DISPLAY_NAME_PRIMARY进行排序。< / LI>
  2. cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)为您提供了一个列索引,而不是字段的值,这就是您获取3的原因(它是PROJECTION2中定义的第4个字段{1}}),将hasPhoneNumber更改为mHasPhoneNumberIdx以避免混淆。
  3. hasPhoneNumber = mCursor.getInt(mHasPhoneNumberIdx);添加到您的onBindViewHolder方法,以获取实际值。
  4. getPhoneNumberFromContactId内运行像onBindViewHolder的真实实现这样的长命令真的很糟糕......你应该更改主查询,这样你就可以做两个大查询,一个针对所有联系人,一个针对所有人电话,然后使用一些HashMap来获取使用联系人ID的电话。