Android 添加新联系人后如何更新RecyclerView(包含联系人列表)?
我的问题是: 我有4门课:Android 添加新联系人后如何更新RecyclerView(包含联系人列表)?,android,android-recyclerview,contacts,Android,Android Recyclerview,Contacts,我的问题是: 我有4门课: public class MainActivity extends AppCompatActivity { public static final int REQUEST_CODE_SPEECH_INPUT=1000; private TabLayout tabLayout; private ViewPager viewPager; private ViewPagerAdapter adapter; private Toolba
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE_SPEECH_INPUT=1000;
private TabLayout tabLayout;
private ViewPager viewPager;
private ViewPagerAdapter adapter;
private Toolbar toolbar;
private SearchView sv;
private FloatingActionButton fab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initializing vars
tabLayout = (TabLayout) findViewById(R.id.tablayout_id);
viewPager = (ViewPager) findViewById(R.id.viewpager_id);
toolbar = (Toolbar) findViewById(R.id.toolbar);
sv = (SearchView) toolbar.findViewById(R.id.searchview);
fab =(FloatingActionButton)findViewById(R.id.fab);
ImageView img_voice_search = (ImageView) toolbar.findViewById(R.id.ic_voice);
adapter = new ViewPagerAdapter(getSupportFragmentManager());
//Set to toolbar
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false); //Remove Title of Toolbar
//Add Fragment here
adapter.addFragment(new CallFragment(),"GẦN ĐÂY");
adapter.addFragment(new ContactFragment(), "DANH BẠ");
viewPager.setAdapter(adapter);
//Custom tablayout
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabTextColors(getResources().getColor(R.color.colorHintTextLight), getResources().getColor(R.color.colorTextLight));
//Speech to Text
img_voice_search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Auto focus to searchview when click image voice
sv.setIconified(false);
sv.requestFocus();
speak();
}
});
//fab on click event
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,NewContactActivity.class);
startActivityForResult(intent, 2);
}
});
}
public void speak(){
Intent mIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL
, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
mIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Hi speak something");
try {
startActivityForResult(mIntent, REQUEST_CODE_SPEECH_INPUT);
} catch (Exception ex){
Toast.makeText(this, "" + ex.getMessage(), Toast.LENGTH_SHORT).show();
}
}
//receive and handle it
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case REQUEST_CODE_SPEECH_INPUT:{
if(resultCode == RESULT_OK && null != data){
//get text array from voice intent
ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
//set to search view
sv.setQuery(result.get(0), true);
}
break;
}
case 2:{
String message=data.getStringExtra("MESSAGE");
Toast.makeText(getApplicationContext(), "Đã thêm danh bạ: " + message, Toast.LENGTH_SHORT).show();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_toolbar, menu);
return true;
}
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
Context mContext;
List<Contact> mData;
Dialog mDialog;
private TextView dialog_tvName, dialog_tvPhone, dialog_Fname;
public RecyclerViewAdapter(Context mContext, List<Contact> mData) {
this.mContext = mContext;
this.mData = mData;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v;
v = LayoutInflater.from(mContext).inflate(R.layout.item_contact, viewGroup, false);
final MyViewHolder viewHolder = new MyViewHolder(v);
//Initializing my dialog
mDialog = new Dialog(mContext);
mDialog.setContentView(R.layout.dialog_contact);
mDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
viewHolder.items_contact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog_tvName = (TextView)mDialog.findViewById(R.id.dialog_tvName);
dialog_tvPhone = (TextView)mDialog.findViewById(R.id.dialog_tvPhone);
dialog_Fname = (TextView)mDialog.findViewById(R.id.dialog_Fname);
// ImageView dialog_contact_img = (ImageView) mDialog.findViewById(R.id.dialog_img);
dialog_tvName.setText(mData.get(viewHolder.getAdapterPosition()).getName());
dialog_tvPhone.setText(mData.get(viewHolder.getAdapterPosition()).getPhone());
dialog_Fname.setText(mData.get(viewHolder.getAdapterPosition()).getFname());
// dialog_contact_img.setImageResource(mData.get(viewHolder.getAdapterPosition()).getPhoto());
// Toast.makeText(mContext, "Test Click " + String.valueOf(viewHolder.getAdapterPosition()), Toast.LENGTH_SHORT).show();
mDialog.show();
//Sự kiện click vào icon gọi để chuyển hướng cuộc gọi đến sđt đc chọn
ImageView call_button = (ImageView)mDialog.findViewById(R.id.call_button);
ImageView chat_button = (ImageView)mDialog.findViewById(R.id.chat_button);
call_button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// Intent i1 = new Intent (mContext, MainActivity.class);
mContext.startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + mData.get(viewHolder.getAdapterPosition()).getPhone())));
}
});
//click vào icon sms để vào ô chat với sđt đó
chat_button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
mContext.startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+ mData.get(viewHolder.getAdapterPosition()).getPhone())));
}
});
}
});
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int position) {
myViewHolder.tvName.setText(mData.get(position).getName());
myViewHolder.tvFname.setText(mData.get(position).getFname());
// myViewHolder.img.setImageResource(mData.get(position).getPhoto());
}
@Override
public int getItemCount() {
return mData.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder{
private LinearLayout items_contact;
private TextView tvName;
private TextView tvFname;
private ImageView img;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
items_contact = (LinearLayout) itemView.findViewById(R.id.contact_items_id);
tvName = (TextView)itemView.findViewById(R.id.tvName);
tvFname = (TextView)itemView.findViewById(R.id.tvFname);
img = (ImageView)itemView.findViewById(R.id.img_contact);
}
}
}
public class ContactFragment extends Fragment {
View v;
private RecyclerView recyclerView;
private List<Contact> lstContact;
public ContactFragment() {
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
v = inflater.inflate(R.layout.contact_fragment, container, false);
recyclerView = (RecyclerView)v.findViewById(R.id.contact_recyclerview);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), lstContact);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
return v;
}
public void loadContacList(){
//Accessing to contact list and get info
ContentResolver resolver = getActivity().getContentResolver();
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()){
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
List<String> lstPhoneNumber = new ArrayList<>();
List<String> lstEmail = new ArrayList<>();
//Phone
Cursor phoneCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?"
, new String[]{id}, null);
while (phoneCursor.moveToNext() && phoneCursor != null){
String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
lstPhoneNumber.add(phoneNumber);
}
phoneCursor.close();
//Email
Cursor emailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI
, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?"
, new String[]{id}, null);
while (emailCursor.moveToNext() && emailCursor != null){
String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
lstEmail.add(email);
}
emailCursor.close();
lstContact.add(new Contact(id, name, name.substring(0, 1).toUpperCase()
, lstPhoneNumber.size() == 0 ? "" : lstPhoneNumber.get(0)
, lstEmail.size()== 0 ? "" : lstEmail.get(0)));
}
cursor.close();
Collections.sort(lstContact, new CustomComparaterLetterContact());
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lstContact = new ArrayList<>();
loadContacList();
}
//Class to Compare lstContact for letters
private class CustomComparaterLetterContact implements Comparator<Contact> {
@Override
public int compare(Contact o1, Contact o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
}
}
public class NewContactActivity extends AppCompatActivity {
private EditText edtName;
private EditText edtPhone;
private EditText edtEmail;
private ImageButton btnBack;
private TextView edtAdd;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_contact);
btnBack = (ImageButton) findViewById(R.id.btnBack);
edtAdd = (TextView) findViewById(R.id.edtAdd);
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
// LinearLayout llExtraFields = findViewById(R.id.admin);
// if (llExtraFields.getVisibility() == View.VISIBLE) {
// llExtraFields.setVisibility(View.GONE);
// } else {
// llExtraFields.setVisibility(View.VISIBLE);
// }
edtAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
edtName = (EditText) findViewById(R.id.edtName);
edtPhone = (EditText) findViewById(R.id.edtPhone);
edtEmail = (EditText)findViewById(R.id.edtEmail);
String name = edtName.getText().toString();
String phone = edtPhone.getText().toString();
String email = edtEmail.getText().toString();
ArrayList < ContentProviderOperation > ops = new ArrayList < ContentProviderOperation > ();
ops.add(ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
if (name != null) {
ops.add(ContentProviderOperation.newInsert(
ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
name).build());
}
if (phone != null) {
ops.add(ContentProviderOperation.
newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
.build());
}
if (email != null) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Email.DATA, email)
.withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
.build());
}
try {
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Toast.makeText(getApplicationContext(), "Thêm thành công danh bạ: " + name, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Thêm thành công danh bạ: " + name, Toast.LENGTH_SHORT).show();
}
Intent intent=new Intent();
intent.putExtra("MESSAGE",name);
setResult(2,intent);
finish();
}
});
}
}
- MainActivity.java
- RecycleServiceAdapter.java
- ContactFragment.java
- NewContactActivity.java
- 在
中,我单击MainActivity
进入AddButton
NewContactActivity
- 在
I中键入信息联系人,然后单击NewContactActivity
,将信息保存到save按钮
,然后返回MainActivityContactList
- 在MainActivity中,现在RecyclerView使用我刚刚添加的新数据进行更新
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE_SPEECH_INPUT=1000;
private TabLayout tabLayout;
private ViewPager viewPager;
private ViewPagerAdapter adapter;
private Toolbar toolbar;
private SearchView sv;
private FloatingActionButton fab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initializing vars
tabLayout = (TabLayout) findViewById(R.id.tablayout_id);
viewPager = (ViewPager) findViewById(R.id.viewpager_id);
toolbar = (Toolbar) findViewById(R.id.toolbar);
sv = (SearchView) toolbar.findViewById(R.id.searchview);
fab =(FloatingActionButton)findViewById(R.id.fab);
ImageView img_voice_search = (ImageView) toolbar.findViewById(R.id.ic_voice);
adapter = new ViewPagerAdapter(getSupportFragmentManager());
//Set to toolbar
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false); //Remove Title of Toolbar
//Add Fragment here
adapter.addFragment(new CallFragment(),"GẦN ĐÂY");
adapter.addFragment(new ContactFragment(), "DANH BẠ");
viewPager.setAdapter(adapter);
//Custom tablayout
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabTextColors(getResources().getColor(R.color.colorHintTextLight), getResources().getColor(R.color.colorTextLight));
//Speech to Text
img_voice_search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Auto focus to searchview when click image voice
sv.setIconified(false);
sv.requestFocus();
speak();
}
});
//fab on click event
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,NewContactActivity.class);
startActivityForResult(intent, 2);
}
});
}
public void speak(){
Intent mIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL
, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
mIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Hi speak something");
try {
startActivityForResult(mIntent, REQUEST_CODE_SPEECH_INPUT);
} catch (Exception ex){
Toast.makeText(this, "" + ex.getMessage(), Toast.LENGTH_SHORT).show();
}
}
//receive and handle it
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case REQUEST_CODE_SPEECH_INPUT:{
if(resultCode == RESULT_OK && null != data){
//get text array from voice intent
ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
//set to search view
sv.setQuery(result.get(0), true);
}
break;
}
case 2:{
String message=data.getStringExtra("MESSAGE");
Toast.makeText(getApplicationContext(), "Đã thêm danh bạ: " + message, Toast.LENGTH_SHORT).show();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_toolbar, menu);
return true;
}
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
Context mContext;
List<Contact> mData;
Dialog mDialog;
private TextView dialog_tvName, dialog_tvPhone, dialog_Fname;
public RecyclerViewAdapter(Context mContext, List<Contact> mData) {
this.mContext = mContext;
this.mData = mData;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v;
v = LayoutInflater.from(mContext).inflate(R.layout.item_contact, viewGroup, false);
final MyViewHolder viewHolder = new MyViewHolder(v);
//Initializing my dialog
mDialog = new Dialog(mContext);
mDialog.setContentView(R.layout.dialog_contact);
mDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
viewHolder.items_contact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog_tvName = (TextView)mDialog.findViewById(R.id.dialog_tvName);
dialog_tvPhone = (TextView)mDialog.findViewById(R.id.dialog_tvPhone);
dialog_Fname = (TextView)mDialog.findViewById(R.id.dialog_Fname);
// ImageView dialog_contact_img = (ImageView) mDialog.findViewById(R.id.dialog_img);
dialog_tvName.setText(mData.get(viewHolder.getAdapterPosition()).getName());
dialog_tvPhone.setText(mData.get(viewHolder.getAdapterPosition()).getPhone());
dialog_Fname.setText(mData.get(viewHolder.getAdapterPosition()).getFname());
// dialog_contact_img.setImageResource(mData.get(viewHolder.getAdapterPosition()).getPhoto());
// Toast.makeText(mContext, "Test Click " + String.valueOf(viewHolder.getAdapterPosition()), Toast.LENGTH_SHORT).show();
mDialog.show();
//Sự kiện click vào icon gọi để chuyển hướng cuộc gọi đến sđt đc chọn
ImageView call_button = (ImageView)mDialog.findViewById(R.id.call_button);
ImageView chat_button = (ImageView)mDialog.findViewById(R.id.chat_button);
call_button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// Intent i1 = new Intent (mContext, MainActivity.class);
mContext.startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + mData.get(viewHolder.getAdapterPosition()).getPhone())));
}
});
//click vào icon sms để vào ô chat với sđt đó
chat_button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
mContext.startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+ mData.get(viewHolder.getAdapterPosition()).getPhone())));
}
});
}
});
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int position) {
myViewHolder.tvName.setText(mData.get(position).getName());
myViewHolder.tvFname.setText(mData.get(position).getFname());
// myViewHolder.img.setImageResource(mData.get(position).getPhoto());
}
@Override
public int getItemCount() {
return mData.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder{
private LinearLayout items_contact;
private TextView tvName;
private TextView tvFname;
private ImageView img;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
items_contact = (LinearLayout) itemView.findViewById(R.id.contact_items_id);
tvName = (TextView)itemView.findViewById(R.id.tvName);
tvFname = (TextView)itemView.findViewById(R.id.tvFname);
img = (ImageView)itemView.findViewById(R.id.img_contact);
}
}
}
public class ContactFragment extends Fragment {
View v;
private RecyclerView recyclerView;
private List<Contact> lstContact;
public ContactFragment() {
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
v = inflater.inflate(R.layout.contact_fragment, container, false);
recyclerView = (RecyclerView)v.findViewById(R.id.contact_recyclerview);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), lstContact);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
return v;
}
public void loadContacList(){
//Accessing to contact list and get info
ContentResolver resolver = getActivity().getContentResolver();
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()){
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
List<String> lstPhoneNumber = new ArrayList<>();
List<String> lstEmail = new ArrayList<>();
//Phone
Cursor phoneCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?"
, new String[]{id}, null);
while (phoneCursor.moveToNext() && phoneCursor != null){
String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
lstPhoneNumber.add(phoneNumber);
}
phoneCursor.close();
//Email
Cursor emailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI
, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?"
, new String[]{id}, null);
while (emailCursor.moveToNext() && emailCursor != null){
String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
lstEmail.add(email);
}
emailCursor.close();
lstContact.add(new Contact(id, name, name.substring(0, 1).toUpperCase()
, lstPhoneNumber.size() == 0 ? "" : lstPhoneNumber.get(0)
, lstEmail.size()== 0 ? "" : lstEmail.get(0)));
}
cursor.close();
Collections.sort(lstContact, new CustomComparaterLetterContact());
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lstContact = new ArrayList<>();
loadContacList();
}
//Class to Compare lstContact for letters
private class CustomComparaterLetterContact implements Comparator<Contact> {
@Override
public int compare(Contact o1, Contact o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
}
}
public class NewContactActivity extends AppCompatActivity {
private EditText edtName;
private EditText edtPhone;
private EditText edtEmail;
private ImageButton btnBack;
private TextView edtAdd;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_contact);
btnBack = (ImageButton) findViewById(R.id.btnBack);
edtAdd = (TextView) findViewById(R.id.edtAdd);
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
// LinearLayout llExtraFields = findViewById(R.id.admin);
// if (llExtraFields.getVisibility() == View.VISIBLE) {
// llExtraFields.setVisibility(View.GONE);
// } else {
// llExtraFields.setVisibility(View.VISIBLE);
// }
edtAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
edtName = (EditText) findViewById(R.id.edtName);
edtPhone = (EditText) findViewById(R.id.edtPhone);
edtEmail = (EditText)findViewById(R.id.edtEmail);
String name = edtName.getText().toString();
String phone = edtPhone.getText().toString();
String email = edtEmail.getText().toString();
ArrayList < ContentProviderOperation > ops = new ArrayList < ContentProviderOperation > ();
ops.add(ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
if (name != null) {
ops.add(ContentProviderOperation.newInsert(
ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
name).build());
}
if (phone != null) {
ops.add(ContentProviderOperation.
newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
.build());
}
if (email != null) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Email.DATA, email)
.withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
.build());
}
try {
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Toast.makeText(getApplicationContext(), "Thêm thành công danh bạ: " + name, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Thêm thành công danh bạ: " + name, Toast.LENGTH_SHORT).show();
}
Intent intent=new Intent();
intent.putExtra("MESSAGE",name);
setResult(2,intent);
finish();
}
});
}
}
public类MainActivity扩展了AppCompatActivity{
公共静态最终整数请求\代码\语音\输入=1000;
私人摊位摊位;
私人视页机视页机;
专用ViewPagerAdapter适配器;
专用工具栏;
私有搜索视图sv;
私人浮动按钮制造厂;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化变量
tabLayout=(tabLayout)findViewById(R.id.tabLayout\u id);
viewPager=(viewPager)findViewById(R.id.viewPager\u id);
toolbar=(toolbar)findviewbyd(R.id.toolbar);
sv=(SearchView)toolbar.findviewbyd(R.id.SearchView);
fab=(FloatingActionButton)findViewById(R.id.fab);
ImageView img_voice_search=(ImageView)toolbar.findViewById(R.id.ic_voice);
适配器=新的ViewPagerAdapter(getSupportFragmentManager());
//设置为工具栏
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayShowTitleEnabled(false);//删除工具栏的标题
//在这里添加片段
addFragment(新的CallFragment(),“GẦNĐY”);
addFragment(新的ContactFragment(),“DANH BẠ");
viewPager.setAdapter(适配器);
//自定义表格布局
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabTextColor(getResources().getColor(R.color.colorHintTextLight),getResources().getColor(R.color.colorTextLight));
//从语音到文本
img\u voice\u search.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//单击图像语音时自动聚焦到searchview
sv.setIconified(假);
sv.requestFocus();
说();
}
});
//点击事件
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意向意向=新意向(MainActivity.this,NewContactActivity.class);
startActivityForResult(意向书,2);
}
});
}
公开演讲{
Intent MINENT=新意图(识别器Intent.ACTION\u识别\u语音);
minent.putExtra(RecognizerIntent.EXTRA_语言_模型
语言(模型)(自由形式),;
minent.putExtra(RecognizerIntent.EXTRA_语言,Locale.getDefault());
minent.putExtra(RecognizerIntent.EXTRA_提示符,“您好,说点什么”);
试一试{
startActivityForResult(输入、请求代码、语音输入);
}捕获(例外情况除外){
Toast.makeText(this,“+ex.getMessage(),Toast.LENGTH_SHORT.show();
}
}
//接收并处理它
@凌驾
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
开关(请求代码){
案例请求\代码\语音\输入:{
if(resultCode==RESULT\u OK&&null!=数据){
//从语音意图获取文本数组
ArrayList结果=data.getStringArrayListExtra(RecognizerIntent.EXTRA_结果);
//设置为搜索视图
sv.setQuery(result.get(0),true);
}
打破
}
案例2:{
字符串消息=data.getStringExtra(“消息”);
Toast.makeText(getApplicationContext(),“thêm danh bạ: “+留言,祝酒词。长度(短)。show();
}
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.menu\u工具栏,菜单);
返回true;
}
}
RecycleServiceAdapter.java:
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE_SPEECH_INPUT=1000;
private TabLayout tabLayout;
private ViewPager viewPager;
private ViewPagerAdapter adapter;
private Toolbar toolbar;
private SearchView sv;
private FloatingActionButton fab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initializing vars
tabLayout = (TabLayout) findViewById(R.id.tablayout_id);
viewPager = (ViewPager) findViewById(R.id.viewpager_id);
toolbar = (Toolbar) findViewById(R.id.toolbar);
sv = (SearchView) toolbar.findViewById(R.id.searchview);
fab =(FloatingActionButton)findViewById(R.id.fab);
ImageView img_voice_search = (ImageView) toolbar.findViewById(R.id.ic_voice);
adapter = new ViewPagerAdapter(getSupportFragmentManager());
//Set to toolbar
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false); //Remove Title of Toolbar
//Add Fragment here
adapter.addFragment(new CallFragment(),"GẦN ĐÂY");
adapter.addFragment(new ContactFragment(), "DANH BẠ");
viewPager.setAdapter(adapter);
//Custom tablayout
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabTextColors(getResources().getColor(R.color.colorHintTextLight), getResources().getColor(R.color.colorTextLight));
//Speech to Text
img_voice_search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Auto focus to searchview when click image voice
sv.setIconified(false);
sv.requestFocus();
speak();
}
});
//fab on click event
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,NewContactActivity.class);
startActivityForResult(intent, 2);
}
});
}
public void speak(){
Intent mIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL
, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
mIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Hi speak something");
try {
startActivityForResult(mIntent, REQUEST_CODE_SPEECH_INPUT);
} catch (Exception ex){
Toast.makeText(this, "" + ex.getMessage(), Toast.LENGTH_SHORT).show();
}
}
//receive and handle it
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case REQUEST_CODE_SPEECH_INPUT:{
if(resultCode == RESULT_OK && null != data){
//get text array from voice intent
ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
//set to search view
sv.setQuery(result.get(0), true);
}
break;
}
case 2:{
String message=data.getStringExtra("MESSAGE");
Toast.makeText(getApplicationContext(), "Đã thêm danh bạ: " + message, Toast.LENGTH_SHORT).show();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_toolbar, menu);
return true;
}
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
Context mContext;
List<Contact> mData;
Dialog mDialog;
private TextView dialog_tvName, dialog_tvPhone, dialog_Fname;
public RecyclerViewAdapter(Context mContext, List<Contact> mData) {
this.mContext = mContext;
this.mData = mData;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v;
v = LayoutInflater.from(mContext).inflate(R.layout.item_contact, viewGroup, false);
final MyViewHolder viewHolder = new MyViewHolder(v);
//Initializing my dialog
mDialog = new Dialog(mContext);
mDialog.setContentView(R.layout.dialog_contact);
mDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
viewHolder.items_contact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog_tvName = (TextView)mDialog.findViewById(R.id.dialog_tvName);
dialog_tvPhone = (TextView)mDialog.findViewById(R.id.dialog_tvPhone);
dialog_Fname = (TextView)mDialog.findViewById(R.id.dialog_Fname);
// ImageView dialog_contact_img = (ImageView) mDialog.findViewById(R.id.dialog_img);
dialog_tvName.setText(mData.get(viewHolder.getAdapterPosition()).getName());
dialog_tvPhone.setText(mData.get(viewHolder.getAdapterPosition()).getPhone());
dialog_Fname.setText(mData.get(viewHolder.getAdapterPosition()).getFname());
// dialog_contact_img.setImageResource(mData.get(viewHolder.getAdapterPosition()).getPhoto());
// Toast.makeText(mContext, "Test Click " + String.valueOf(viewHolder.getAdapterPosition()), Toast.LENGTH_SHORT).show();
mDialog.show();
//Sự kiện click vào icon gọi để chuyển hướng cuộc gọi đến sđt đc chọn
ImageView call_button = (ImageView)mDialog.findViewById(R.id.call_button);
ImageView chat_button = (ImageView)mDialog.findViewById(R.id.chat_button);
call_button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// Intent i1 = new Intent (mContext, MainActivity.class);
mContext.startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + mData.get(viewHolder.getAdapterPosition()).getPhone())));
}
});
//click vào icon sms để vào ô chat với sđt đó
chat_button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
mContext.startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+ mData.get(viewHolder.getAdapterPosition()).getPhone())));
}
});
}
});
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int position) {
myViewHolder.tvName.setText(mData.get(position).getName());
myViewHolder.tvFname.setText(mData.get(position).getFname());
// myViewHolder.img.setImageResource(mData.get(position).getPhoto());
}
@Override
public int getItemCount() {
return mData.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder{
private LinearLayout items_contact;
private TextView tvName;
private TextView tvFname;
private ImageView img;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
items_contact = (LinearLayout) itemView.findViewById(R.id.contact_items_id);
tvName = (TextView)itemView.findViewById(R.id.tvName);
tvFname = (TextView)itemView.findViewById(R.id.tvFname);
img = (ImageView)itemView.findViewById(R.id.img_contact);
}
}
}
public class ContactFragment extends Fragment {
View v;
private RecyclerView recyclerView;
private List<Contact> lstContact;
public ContactFragment() {
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
v = inflater.inflate(R.layout.contact_fragment, container, false);
recyclerView = (RecyclerView)v.findViewById(R.id.contact_recyclerview);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), lstContact);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
return v;
}
public void loadContacList(){
//Accessing to contact list and get info
ContentResolver resolver = getActivity().getContentResolver();
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()){
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
List<String> lstPhoneNumber = new ArrayList<>();
List<String> lstEmail = new ArrayList<>();
//Phone
Cursor phoneCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?"
, new String[]{id}, null);
while (phoneCursor.moveToNext() && phoneCursor != null){
String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
lstPhoneNumber.add(phoneNumber);
}
phoneCursor.close();
//Email
Cursor emailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI
, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?"
, new String[]{id}, null);
while (emailCursor.moveToNext() && emailCursor != null){
String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
lstEmail.add(email);
}
emailCursor.close();
lstContact.add(new Contact(id, name, name.substring(0, 1).toUpperCase()
, lstPhoneNumber.size() == 0 ? "" : lstPhoneNumber.get(0)
, lstEmail.size()== 0 ? "" : lstEmail.get(0)));
}
cursor.close();
Collections.sort(lstContact, new CustomComparaterLetterContact());
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lstContact = new ArrayList<>();
loadContacList();
}
//Class to Compare lstContact for letters
private class CustomComparaterLetterContact implements Comparator<Contact> {
@Override
public int compare(Contact o1, Contact o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
}
}
public class NewContactActivity extends AppCompatActivity {
private EditText edtName;
private EditText edtPhone;
private EditText edtEmail;
private ImageButton btnBack;
private TextView edtAdd;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_contact);
btnBack = (ImageButton) findViewById(R.id.btnBack);
edtAdd = (TextView) findViewById(R.id.edtAdd);
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
// LinearLayout llExtraFields = findViewById(R.id.admin);
// if (llExtraFields.getVisibility() == View.VISIBLE) {
// llExtraFields.setVisibility(View.GONE);
// } else {
// llExtraFields.setVisibility(View.VISIBLE);
// }
edtAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
edtName = (EditText) findViewById(R.id.edtName);
edtPhone = (EditText) findViewById(R.id.edtPhone);
edtEmail = (EditText)findViewById(R.id.edtEmail);
String name = edtName.getText().toString();
String phone = edtPhone.getText().toString();
String email = edtEmail.getText().toString();
ArrayList < ContentProviderOperation > ops = new ArrayList < ContentProviderOperation > ();
ops.add(ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
if (name != null) {
ops.add(ContentProviderOperation.newInsert(
ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
name).build());
}
if (phone != null) {
ops.add(ContentProviderOperation.
newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
.build());
}
if (email != null) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Email.DATA, email)
.withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
.build());
}
try {
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Toast.makeText(getApplicationContext(), "Thêm thành công danh bạ: " + name, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Thêm thành công danh bạ: " + name, Toast.LENGTH_SHORT).show();
}
Intent intent=new Intent();
intent.putExtra("MESSAGE",name);
setResult(2,intent);
finish();
}
});
}
}
公共类RecycleServiceAdapter扩展了RecyclerView.Adapter{
语境;
列出mData;
对话mDialog;
私有文本视图对话框\u tvName、对话框\u tvPhone、对话框\u Fname;
公共RecycleServiceAdapter(上下文mContext,列表mData){
this.mContext=mContext;
this.mData=mData;
}
@非空
@凌驾
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
观点五;
v=布局更平坦。从(mContext)。充气(R.layout.item_触点,视图组,假);
最终MyViewHolder viewHolder=新MyViewHolder(v);
//初始化我的对话框
mDialog=新建对话框(mContext);
mDialog.setContentView(R.layout.dialog\u联系人);
mDialog.getWindow().setBackgroundDrawable(新的ColorDrawable(Color.TRANSPARENT));
viewHolder.items\u contact.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
dialog\u tvName=(TextView)mDialog.findviewbyd(R.id.dialog\u tvName);
dialog\u tvPhone=(TextView)mDialog.findViewById(R.id.dialog\u tvPhone);
dialog\u Fname=(TextView)mDialog.findviewbyd(R.id.dialog\u Fname);
//ImageView对话框\u联系人\u img=(ImageView)mDialog.findViewById(R.id.dialog\u img);
对话_