Android系统联系人全特效实现,字母表快速滚动
程序员文章站
2024-02-27 20:44:57
...
说一下写这篇博文的背景,最近一直在学习Android开发,在看Android界的大神郭霖的博客
Android系统联系人全特效实现(上),分组导航和挤压动画:
http://blog.csdn.net/guolin_blog/article/details/9097463时,对照着他的博文编写了程序,但是却无法运行出他博客中的效果。想想原因也是,他写这篇博文的时候是在2013年,那个时候的Android还是2.0的版本,现在都到了8.0版本了,Android内部肯定进行了很多的改变。
既然出现了问题,那么就要解决问题。运行他的源代码出现了2个问题,第一个问题就是:
运行程序时报错如图所示:
这里重点看划线部分,很明显这是提示缺少授权。
Android6.0以前要读取联系人信息,这需要在AndroidManifest.xml文件中加上android.permission.READ_CONTACTS的声明即可。但是Android6.0加入了运行时权限,所以这里读取联系人的信息需要用到运行时权限,就不能那么简单的进行了。这里要在MainActivity.java文件中加入运行时权限的申请,代码修改如下:
1.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter = new ContactAdapter(this, R.layout.contact_item, contacts);
titleLayout = (LinearLayout) findViewById(R.id.title_layout);
sectionToastLayout = (RelativeLayout) findViewById(R.id.section_toast_layout);
title = (TextView) findViewById(R.id.title);
sectionToastText = (TextView) findViewById(R.id.section_toast_text);
alphabetButton = (Button) findViewById(R.id.alphabetButton);
contactsListView = (ListView) findViewById(R.id.contacts_list_view);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1);
}else {
readContacts();
}
}
这里把之前的直接读取通讯录信息放到了readContacts()函数中。
2.
private void readContacts(){
Cursor cursor = null;
try{
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
cursor = getContentResolver().query(uri, new String[] { "display_name", "sort_key" }, null, null, "sort_key");
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(0);
String sortKey = getSortKey(cursor.getString(1));
Contact contact = new Contact();
contact.setName(name);
contact.setSortKey(sortKey);
contacts.add(contact);
} while (cursor.moveToNext());
}
startManagingCursor(cursor);
indexer = new AlphabetIndexer(cursor, 1, alphabet);
adapter.setIndexer(indexer);
if (contacts.size() > 0) {
setupContactsListView();
setAlpabetListener();
}
//adapter.notifyDataSetChanged();
}catch (Exception e){
e.printStackTrace();
}finally {
if (cursor != null){
//cursor.close();
}
}
}
3.另外还要重写onRequestPermissionsResult()方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
readContacts();
}else {
Toast.makeText(this,"You denied the permission",Toast.LENGTH_LONG).show();
}
break;
default:
}
}
经过这三步的修改后,代码可以运行了,运行的时候会提示我们进行授权: 点击允许后,程序允许结果如图所示:发现并没有出现郭霖博客中显示的效果。针对这个问题,设置断点调试程序,发现在getSortKey函数中第一句得到的key值是汉字,并非汉语拼音的首字母。比如说通信录中的人名张三,按照郭霖博客中讲述的,返回的key值应该是Z,但是这里返回的却是“张”,这样的话就导致这个方法中一律返回的是“#”。到了这里,我感觉到无助了。但是又不想放弃,于是我打算亲自看看raw_contacts(/data/data/com.android.providers.contacts/databases/contacts2.db)这张表。怎么导出这张表可以参考博客(http://blog.csdn.net/feidie436/article/details/62224354)。我使用Navicat打开这张表,看到这张表数据如图所示:可以看到这张表中sort_key这一列只有汉字,已经不再像郭神博客中讲述的那样了。这里有一列phonebook_label但是符合我们的需要。这里我们把代码进行一下修改如下:这里把读取sort_key改成读取phonebook_label,运行程序,得到了我们想要的结果:点击这里,下载源代码