实现一个类似于拨号页面的效果
public class PhoneActivity extends AppCompatActivity {
String[] arr = {"android.permission.READ_CONTACTS"};
private RecyclerView recyclerView;
private String label = "";
private ArrayList<PhoneBean> list = new ArrayList<>();
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
jurisdiction();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_phone);
linkman();//获取手机联系人
initView();//主方法
}
/**
*动态获取手机权限
*/
private void jurisdiction() {
if(Build.VERSION.SDK_INT >= 23){
int permission = ActivityCompat.checkSelfPermission(this, "android.permission.READ_CONTACTS");
if(permission != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,arr,0);
}
}
}
//获取手机联系人
private void linkman() {
ContentResolver contentResolver = getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
Cursor cursor = contentResolver.query(uri, null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String label = cursor.getString(cursor.getColumnIndex("phonebook_label"));
//如果拿到的首字母等于之前的首字母
if(label.equals(this.label)){
//1为对象 0为标题
//直接添加对象 label项填空
list.add(new PhoneBean(name,number,"",1));
}else{
//如果不相等
//先添加一个标题对象 只填标题 其他为空
list.add(new PhoneBean("","",label,0));
//然后再添加内容对象
list.add(new PhoneBean(name,number,"",1));
//将标题赋给外部的label
this.label = label;
}
}
}
private void initView() {
recyclerView = findViewById(R.id.rv);
adapter = new MyAdapter(list,this);
recyclerView.setAdapter(adapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
//滚动到具有偏移量的位置 参数一 下标,参数二 偏移量
linearLayoutManager.scrollToPositionWithOffset(2,0);
}
}
//适配器
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<PhoneBean> list;
private Context context;
public MyAdapter(ArrayList<PhoneBean> list, Context context) {
this.list = list;
this.context = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = null;
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
//判断类型 根据之前的type 写两个不同的布局
if(i == 0){
return new TitleViewHolder(LayoutInflater.from(context).inflate(R.layout.title_layout,viewGroup,false));
}else {
return new PhoneViewHolder(LayoutInflater.from(context).inflate(R.layout.person_layout,viewGroup,false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
//根据type判断类型
if(list.get(i).getType() == 0){
TitleViewHolder titleViewHolder = (TitleViewHolder) viewHolder;
titleViewHolder.mTitle.setText(list.get(i).getLabel()+"");
}else{
PhoneViewHolder phoneViewHolder = (PhoneViewHolder) viewHolder;
phoneViewHolder.number.setText(list.get(i).getNumber());
phoneViewHolder.name.setText(list.get(i).getName());
}
}
@Override
public int getItemCount() {
return list.size();
}
//注意重写这个方法 获取类型长度
@Override
public int getItemViewType(int position) {
return list.get(position).getType();
}
//注意重写这个方法 获取条目id
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
//写两个类代表不同的布局
private class TitleViewHolder extends RecyclerView.ViewHolder {
TextView mTitle;
public TitleViewHolder(View view) {
super(view);
mTitle = view.findViewById(R.id.title);
}
}
private class PhoneViewHolder extends RecyclerView.ViewHolder {
TextView name;
TextView number;
public PhoneViewHolder(View view) {
super(view);
name = view.findViewById(R.id.name);
number = view.findViewById(R.id.number);
}
}
}
public class PhoneBean {
private String name;
private String number;
private String label;
private int type;
public PhoneBean(String name, String number, String label, int type) {
this.name = name;
this.number = number;
this.label = label;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String toString() {
return "PhoneBean{" +
"name='" + name + '\'' +
", number='" + number + '\'' +
", label='" + label + '\'' +
", type=" + type +
'}';
}
}