欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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个问题,第一个问题就是:

运行程序时报错如图所示:

Android系统联系人全特效实现,字母表快速滚动

这里重点看划线部分,很明显这是提示缺少授权。

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:
        }
    }

经过这三步的修改后,代码可以运行了,运行的时候会提示我们进行授权: Android系统联系人全特效实现,字母表快速滚动点击允许后,程序允许结果如图所示:Android系统联系人全特效实现,字母表快速滚动发现并没有出现郭霖博客中显示的效果。针对这个问题,设置断点调试程序,发现在getSortKey函数中第一句得到的key值是汉字,并非汉语拼音的首字母。比如说通信录中的人名张三,按照郭霖博客中讲述的,返回的key值应该是Z,但是这里返回的却是“张”,这样的话就导致这个方法中一律返回的是“#”。Android系统联系人全特效实现,字母表快速滚动到了这里,我感觉到无助了。但是又不想放弃,于是我打算亲自看看raw_contacts(/data/data/com.android.providers.contacts/databases/contacts2.db)这张表。怎么导出这张表可以参考博客(http://blog.csdn.net/feidie436/article/details/62224354)。我使用Navicat打开这张表,看到这张表数据如图所示:Android系统联系人全特效实现,字母表快速滚动可以看到这张表中sort_key这一列只有汉字,已经不再像郭神博客中讲述的那样了。这里有一列phonebook_label但是符合我们的需要。这里我们把代码进行一下修改如下:Android系统联系人全特效实现,字母表快速滚动这里把读取sort_key改成读取phonebook_label,运行程序,得到了我们想要的结果:Android系统联系人全特效实现,字母表快速滚动点击这里,下载源代码