我正在向回收者视图提取联系人...现在以下代码效果很好但是在获取联系人时需要花费太多时间....所以如果有任何方法可以快速获取联系人,请指导我
public class AllContactsAdapter extends RecyclerView.Adapter<AllContactsAdapter.ContactViewHolder>{
private List<ContactVO> contactVOList;
private Context mContext;
public AllContactsAdapter(List<ContactVO> contactVOList, Context mContext){
this.contactVOList = contactVOList;
this.mContext = mContext;
}
@Override
public ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.single_contact_view, null);
ContactViewHolder contactViewHolder = new ContactViewHolder(view);
return contactViewHolder;
}
@Override
public void onBindViewHolder(ContactViewHolder holder, int position) {
ContactVO contactVO = contactVOList.get(position);
holder.tvContactName.setText(contactVO.getContactName());
holder.tvPhoneNumber.setText(contactVO.getContactNumber());
}
@Override
public int getItemCount() {
return contactVOList.size();
}
public static class ContactViewHolder extends RecyclerView.ViewHolder{
ImageView ivContactImage;
TextView tvContactName;
TextView tvPhoneNumber;
public ContactViewHolder(View itemView) {
super(itemView);
ivContactImage = (ImageView) itemView.findViewById(R.id.ivContactImage);
tvContactName = (TextView) itemView.findViewById(R.id.tvContactName);
tvPhoneNumber = (TextView) itemView.findViewById(R.id.tvPhoneNumber);
}
}
}
这是我提取联系人的地方......
private void getAllContacts() {
List<ContactVO> contactVOList = new ArrayList();
ContactVO contactVO;
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
if (hasPhoneNumber > 0) {
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
contactVO = new ContactVO();
contactVO.setContactName(name);
Cursor phoneCursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{id},
null);
if (phoneCursor.moveToNext()) {
String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactVO.setContactNumber(phoneNumber);
}
phoneCursor.close();
Cursor emailCursor = contentResolver.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]{id}, null);
while (emailCursor.moveToNext()) {
String emailId = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
}
contactVOList.add(contactVO);
}
}
AllContactsAdapter contactAdapter = new AllContactsAdapter(contactVOList, getApplicationContext());
rvContacts.setLayoutManager(new LinearLayoutManager(this));
rvContacts.setAdapter(contactAdapter);
}
答案 0 :(得分:0)
此代码可以帮助您
我检索所有联系人并将该联系人绑定到Listview(在您的情况下也可以使用RecyclerView)
public class ContactsActivity extends AppCompatActivity {
String[] mProjection;
Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts);
mProjection = new String[] {
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Photo.PHOTO
};
cursor = getActivity().getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
mProjection,
null,
null,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC"
);
ContactListAdapter adapter = new ContactListAdapter(getContext(),cursor);
final ListView listView = (ListView) findViewById(R.id.lvContactDisplay);
listView.setAdapter(adapter);
}
}
public class ContactListAdapter extends BaseAdapter {
private Context mContext;
private Cursor mCursor;
String[] mProjection;
// State of the row that needs to show separator
private static final int SECTIONED_STATE = 1;
// State of the row that need not show separator
private static final int REGULAR_STATE = 2;
// Cache row states based on positions
private int[] mRowStates;
public ContactListAdapter(Context context, Cursor cursor) {
mContext = context;
mCursor = cursor;
mRowStates = new int[getCount()];
}
@Override
public int getCount() {
return mCursor.getCount();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
boolean showSeparator = false;
mProjection = new String[] {
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Photo.PHOTO
};
mCursor.moveToPosition(position);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.row_display_contacts, null);
}
else {
view = convertView;
}
ImageView profileUser = (ImageView) view.findViewById(R.id.ivProfileUser);
TextView contactNameView = (TextView) view.findViewById(R.id.tvUserContactName);
TextView contactId = (TextView) view.findViewById(R.id.tvUserContactId);
contactId.setVisibility(View.GONE);
String id = mCursor.getString(mCursor.getColumnIndex(mProjection[0]));
String name = mCursor.getString( mCursor.getColumnIndex(mProjection[1]));
int photo = mCursor.getInt(mCursor.getColumnIndex(mProjection[2]));
contactNameView.setText( name );
contactId.setText(id);
if (photo == 0){
profileUser.setImageResource(R.drawable.ic_profile_user);
}
else {
profileUser.setImageResource(photo);
}
switch (mRowStates[position]) {
case SECTIONED_STATE:
showSeparator = true;
break;
case REGULAR_STATE:
showSeparator = false;
break;
default:
if (position == 0) {
showSeparator = true;
}
else {
mCursor.moveToPosition(position - 1);
String previousName = mCursor.getString(mCursor.getColumnIndex(mProjection[1]));
char[] previousNameArray = previousName.toCharArray();
char[] nameArray = name.toCharArray();
if (nameArray[0] != previousNameArray[0]) {
showSeparator = true;
}
mCursor.moveToPosition(position);
}
// Cache it
mRowStates[position] = showSeparator ? SECTIONED_STATE : REGULAR_STATE;
break;
}
TextView separatorView = (TextView) view.findViewById(R.id.tvContactAlphabetOrder);
if (showSeparator) {
separatorView.setText(name.toCharArray(), 0, 1);
separatorView.setVisibility(View.VISIBLE);
}
else {
view.findViewById(R.id.tvContactAlphabetOrder).setVisibility(View.GONE);
}
return view;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvContactAlphabetOrder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="abc"
android:padding="2dp"
android:background="#C8C8C8"
android:textSize="@dimen/font_size"
android:textStyle="bold"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_gravity="center_horizontal">
<ImageView
android:id="@+id/ivProfileUser"
android:layout_width="50dp"
android:layout_height="50dp"
android:scaleType="fitXY"
android:layout_gravity="center"
android:src="@drawable/ic_profile_user"/>
<TextView
android:id="@+id/tvUserContactName"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="abc"
android:layout_gravity="center"
android:padding="2dp"
android:textColor="@color/navigationBarColor"
android:layout_marginLeft="5dp"
android:textSize="@dimen/font_size" />
<TextView
android:id="@+id/tvUserContactId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="abcdsfs"
android:layout_gravity="center"
android:padding="2dp"
android:textColor="@color/navigationBarColor"
android:layout_marginLeft="5dp"
android:textSize="@dimen/font_size" />
</LinearLayout>
</LinearLayout>
您可以像这样获得所有联系人: