Android EAD_联系人)!=PackageManager.权限(已授予) { if(ActivityCompat.shouldshowRequestPermissionRegulation(这是Manifest.permission.READ_CONTACTS))
EAD_联系人)!=PackageManager.权限(已授予) { if(ActivityCompat.shouldshowRequestPermissionRegulation(这是Manifest.permission.READ_CONTACTS)){ showPopUpCallBack(这是“信息”,getString(R.string.contactRationalMessage),new DialogInterface.OnClickListener(){ @凌驾 public void onClick(DialogInterface dialog,int which){ if(which==DialogInterface.BUTTON_正值) { RequestPermissionForContacts和Process(); } } }); }否则{ ActivityCompat.requestPermissions(这是新字符串[]{Manifest.permission.READ_CONTACTS},GlobalVariables.CONTACTS_PERMISSIONS); } }否则{ GetAllContacts和Display(); } } @凌驾 public void onRequestPermissionsResult(int-requestCode,字符串权限[],int[]grantResults){ 开关(请求代码){ 案例GlobalVariables.CONTACTS\u权限:{ if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION\u已授予){ GetAllContacts和Display(); } 返回; } } } /** *允许显示联系人列表的方法 */ public void显示联系人列表(){ mContactsChooserAdapter=新联系人SchooseRadapter(getPhoneContacts(),getSelectedContacts()); mContactsChooserAdapter.setOnContactSelectionListener(contactSelectionListener); mLinearLayoutManager=新的LinearLayoutManager(此); mContactsList.setLayoutManager(mLinearLayoutManager); mContactsList.setAdapter(mContactsChooserAdapter); } /** *方法,该方法将检索所有联系人。 */ 私有void GetAllContacts和Display() { mPhoneContacts=新的ArrayList(); 接触; ContentResolver ContentResolver=getContentResolver(); Cursor Cursor=contentResolver.query(ContactsContract.Contacts.CONTENT\u URI,null,null,null,ContactsContract.commondatatypes.Phone.DISPLAY\u NAME+“ASC”); if(cursor.getCount()>0){ while(cursor.moveToNext()){ int hasPhoneNumber=Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 如果(hasPhoneNumber>0){ String id=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.\u id)); String displayName=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 触点=新触点(); setId(Integer.parseInt(id)); contact.setDisplayName(displayName); Cursor phoneCursor=contentResolver.query( ContactsContract.CommonDataTypes.Phone.CONTENT\u URI, 无效的 ContactsContract.CommonDataTypes.Phone.CONTACT_ID+“=?”, 新字符串[]{id}, 无效); if(phoneCursor.moveToNext()){ String phoneNumber=phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER)); contact.getPhoneNumber().add(phoneNumber); } phoneCursor.close(); getPhoneContacts()。添加(联系人); } } } 显示联系人列表(); } /** *方法,该方法允许完成和关闭活动。它返回一个结果。 */ public void finishedChoosingContacts() { 意图=新意图(); intent.putParcelableArrayListExtra(GlobalVariables.CONTACTS_SELECTED_CONTACTS_LABEL,getSelectedContacts()); 设置结果(Activity.RESULT_OK,intent); 完成(); } /** *允许在列表中选择和取消选择联系人的侦听器。 */ private OnContactSelectionListener contactSelectionListener=新建OnContactSelectionListener(){ @凌驾 已选择public void OnContact(联系人){ 如果(getSelectedContacts()==null){ setSelectedContacts(新建ArrayList()); } getSelectedContacts()。添加(联系人); mContactsNbLabel.setText(getSelectedContacts().size()+(getSelectedContacts().size()>1?“contacts”:“contact”); } @凌驾 取消选择公共无效联系人(联系人){ int indexToDelete=-1; 对于(联系人c:getSelectedContacts()){ 如果(c.getId()==contact.getId()){ indexToDelete=getSelectedContacts().indexOf(c); 打破 } } 如果(索引删除>-1){ getSelectedContacts().remove(indexToDelete); mContactsNbLabel.setText(getSelectedContacts().size()+(getSelectedContacts().size()>1?“contacts”:“contact”); } } }; /** *当搜索编辑文本值更改时激发的侦听器。 */ 私有TextWatcher searchViewWatcher=新TextWatcher(){ @凌驾 更改前文本之前的公共void(字符序列s、int start、int count、int after){ } @凌驾 public void onTextChanged(字符序列、int start、int before、int count){ } @凌驾 公共无效后文本已更改(可编辑){ filterListAndUpdate(s.toString()); } }; /** *用于筛选和更新列表的方法 *@param searchedValue */ 私有无效筛选器列表更新(字符串搜索值) { ArrayList associatedSearch=新建ArrayList(); 如果(!“”.equals(searchedValue)&&searchedValue!=null){ 对于(联系人c:getPhoneContacts()){ 如果(c.getDisplayName().toUpperCase().StartWith(searchedValue.toUpperCase())){ 关联搜索。添加(c); } } ((ContactsChooserAdapter)mContactsList.getAdapter()).setContacts(associatedSearch); }否则{ ((ContactsChooserAdapter)mContactsList.getAdapter()).setContacts(getPhoneContacts()); } mContactsList.getAdapter().notifyDataSetChanged(); } /** *允许Android EAD_联系人)!=PackageManager.权限(已授予) { if(ActivityCompat.shouldshowRequestPermissionRegulation(这是Manifest.permission.READ_CONTACTS)),android,list,android-recyclerview,notifydatasetchanged,Android,List,Android Recyclerview,Notifydatasetchanged,EAD_联系人)!=PackageManager.权限(已授予) { if(ActivityCompat.shouldshowRequestPermissionRegulation(这是Manifest.permission.READ_CONTACTS)){ showPopUpCallBack(这是“信息”,getString(R.string.contactRationalMessage),new DialogInterface.OnClickListener(){ @凌驾 public vo
public class ContactsChooserAdapter extends RecyclerView.Adapter<ContactChooserViewHolder> {
private ArrayList<Contact> mContacts;
private ArrayList<Contact> mSelectedContacts;
private OnContactSelectionListener mContactListener;
public ContactsChooserAdapter(ArrayList<Contact> contacts, ArrayList<Contact> selectedContacts)
{
mContacts = contacts;
mSelectedContacts = selectedContacts;
}
public void setOnContactSelectionListener(OnContactSelectionListener listener)
{
mContactListener = listener;
}
@Override
public ContactChooserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.contacts_chooser_list_item, parent, false);
ContactChooserViewHolder holder = new ContactChooserViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(ContactChooserViewHolder holder, int position) {
Contact contact = getContacts().get(position);
if(isAlreadySelected(contact)){
holder.mChoosed.setChecked(true);
}else{
holder.mChoosed.setChecked(false);
}
holder.mContactDisplayName.setText(contact.getDisplayName());
holder.mContactPhoneNumber.setText(contact.getPhoneNumbers().get(0));
if(mContactListener != null) {
holder.bind(contact, mContactListener);
}
}
@Override
public int getItemCount() {
return getContacts().size();
}
/**
* Method which allows to check whenever a contact is already selected in a list or not.
* @param contact
* @return
*/
private boolean isAlreadySelected(Contact contact){
boolean alreadySelected = false;
if(getAlreadySelectedContacts() != null){
System.out.println("ALready selected contact list: "+ getAlreadySelectedContacts().size());
for(Contact c : getAlreadySelectedContacts()){
if(c.getId() == contact.getId()){
alreadySelected = true;
break;
}
}
}
return alreadySelected;
}
public ArrayList<Contact> getContacts() {
return mContacts;
}
public void setContacts(ArrayList<Contact> mContacts) {
this.mContacts = mContacts;
}
public ArrayList<Contact> getAlreadySelectedContacts() {
return mSelectedContacts;
}
public void setAlreadySelectedContacts(ArrayList<Contact> selectedContacts) {
this.mSelectedContacts = selectedContacts;
}
public class ContactsActivity extends AppCompatActivity {
private ArrayList<Contact> mSelectedContacts;
private ArrayList<Contact> mPhoneContacts;
private RecyclerView mContactsList;
private BatifyTextViewBold mContactsNbLabel;
private BatifyEditText mSearchEditText;
private ContactsChooserAdapter mContactsChooserAdapter;
private LinearLayoutManager mLinearLayoutManager;
private RelativeLayout mCancelBtn;
private RelativeLayout mFinishBtn;
private ImageView mSearchIcon;
private RelativeLayout mListHeader;
private RelativeLayout mSearchLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = this.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(ContextCompat.getColor(this, R.color.batifyGreen));
}
Bundle bundle = getIntent().getExtras();
ArrayList<Contact> transmittedContacts = bundle.getParcelableArrayList(GlobalVariables.CONTACTS_SELECTED_CONTACTS_LABEL);
mSelectedContacts = new ArrayList<>();
if(transmittedContacts != null) {
mSelectedContacts.addAll(transmittedContacts);
}
mContactsList = (RecyclerView)findViewById(R.id.contactsList);
mContactsNbLabel = (BatifyTextViewBold)findViewById(R.id.contactNbSelectedTv);
if(getSelectedContacts() == null){
mContactsNbLabel.setText("0 contact ");
}else{
mContactsNbLabel.setText(getSelectedContacts().size() + (getSelectedContacts().size() > 1 ? " contacts " : " contact "));
}
mFinishBtn = (RelativeLayout)findViewById(R.id.finishContactsBtn);
mFinishBtn.setOnClickListener(finishChoosingContactsListener);
mCancelBtn = (RelativeLayout)findViewById(R.id.cancelContactsBtn);
mCancelBtn.setOnClickListener(cancelChoosingContactsListener);
mSearchIcon = (ImageView)findViewById(R.id.searchBtn);
mSearchIcon.setOnClickListener(searchListener);
mListHeader = (RelativeLayout)findViewById(R.id.listHeader);
mListHeader.setVisibility(View.VISIBLE);
mSearchLayout = (RelativeLayout)findViewById(R.id.searchLayout);
mSearchLayout.setVisibility(View.GONE);
mSearchEditText = (BatifyEditText)findViewById(R.id.searchContactsEditText);
mSearchEditText.addTextChangedListener(searchViewWatcher);
requestPermissionForContactsAndProcess();
}
/**
* Method that requests the permission to access contacts.
*/
public void requestPermissionForContactsAndProcess() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED)
{
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) {
Tools.showPopUpCallBack(this, "Information", getString(R.string.contactRationalMessage), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE)
{
requestPermissionForContactsAndProcess();
}
}
});
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, GlobalVariables.CONTACTS_PERMISSIONS);
}
}else{
getAllContactsAndDisplay();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case GlobalVariables.CONTACTS_PERMISSIONS: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getAllContactsAndDisplay();
}
return;
}
}
}
/**
* Method which allows to display a contacts list
*/
public void displayContactList(){
mContactsChooserAdapter = new ContactsChooserAdapter(getPhoneContacts(), getSelectedContacts());
mContactsChooserAdapter.setOnContactSelectionListener(contactSelectionListener);
mLinearLayoutManager = new LinearLayoutManager(this);
mContactsList.setLayoutManager(mLinearLayoutManager);
mContactsList.setAdapter(mContactsChooserAdapter);
}
/**
* Method that will retrieve all contacts.
*/
private void getAllContactsAndDisplay()
{
mPhoneContacts = new ArrayList<>();
Contact contact;
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 displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
contact = new Contact();
contact.setId(Integer.parseInt(id));
contact.setDisplayName(displayName);
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));
contact.getPhoneNumbers().add(phoneNumber);
}
phoneCursor.close();
getPhoneContacts().add(contact);
}
}
}
displayContactList();
}
/**
* Method which allow to finish and close the activity. It returns a result.
*/
public void finishedChoosingContacts()
{
Intent intent= new Intent();
intent.putParcelableArrayListExtra(GlobalVariables.CONTACTS_SELECTED_CONTACTS_LABEL, getSelectedContacts());
setResult(Activity.RESULT_OK, intent);
finish();
}
/**
* Listener which allows to select and deselect a contact in a list.
*/
private OnContactSelectionListener contactSelectionListener = new OnContactSelectionListener() {
@Override
public void onContactSelected(Contact contact) {
if(getSelectedContacts() == null){
setSelectedContacts(new ArrayList<Contact>());
}
getSelectedContacts().add(contact);
mContactsNbLabel.setText(getSelectedContacts().size() + (getSelectedContacts().size() > 1 ? " contacts " : " contact "));
}
@Override
public void onContactDeSelected(Contact contact) {
int indexToDelete = -1;
for(Contact c : getSelectedContacts()){
if(c.getId() == contact.getId()){
indexToDelete = getSelectedContacts().indexOf(c);
break;
}
}
if(indexToDelete > -1) {
getSelectedContacts().remove(indexToDelete);
mContactsNbLabel.setText(getSelectedContacts().size() + (getSelectedContacts().size() > 1 ? " contacts " : " contact "));
}
}
};
/**
* Listener which is fired when the search edit text value is changing.
*/
private TextWatcher searchViewWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
filterListAndUpdate(s.toString());
}
};
/**
* method used to filter and update the list
* @param searchedValue
*/
private void filterListAndUpdate(String searchedValue)
{
ArrayList<Contact> associatedSearch = new ArrayList<>();
if(!"".equals(searchedValue) && searchedValue != null) {
for (Contact c : getPhoneContacts()) {
if (c.getDisplayName().toUpperCase().startsWith(searchedValue.toUpperCase())) {
associatedSearch.add(c);
}
}
((ContactsChooserAdapter)mContactsList.getAdapter()).setContacts(associatedSearch);
}else{
((ContactsChooserAdapter)mContactsList.getAdapter()).setContacts(getPhoneContacts());
}
mContactsList.getAdapter().notifyDataSetChanged();
}
/**
* Listener that allows to fire the search listener.
*/
private View.OnClickListener searchListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
mListHeader.setVisibility(View.GONE);
mSearchLayout.setVisibility(View.VISIBLE);
}
};
/**
* Listener which is fired when the user cancels the contacts selection.
*/
private View.OnClickListener cancelChoosingContactsListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
};
/**
* Listener which id fired when the user finishes selecting contacts.
*/
private View.OnClickListener finishChoosingContactsListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
finishedChoosingContacts();
}
};
public ArrayList<Contact> getSelectedContacts() {
return mSelectedContacts;
}
public void setSelectedContacts(ArrayList<Contact> mSelectedContacts) {
this.mSelectedContacts = mSelectedContacts;
}
public ArrayList<Contact> getPhoneContacts() {
return mPhoneContacts;
}