登录魅族下载通讯录手机获取通讯录报错.麻烦帮我看看好吗

本文主要是通过模仿魅族通讯录,学习一下RecycleView的基本用法,水平有限,如有不当之处,欢迎批评指正,不胜感激!
先看通过RecycleView实现的一个效果图:
完整代码见github:
Recycleview继承关系:
RecycleView的三个主要参与者:
1、LayoutManager
2、ItemAnimator
3、ItemDecoration
本文主要用到的是ItemAnimator和ItemDecoration。
Item动画 ItemAnimator
ItemAnimator是个抽象类,ItemAnimator子类用来管理ViewHolder的动画,官方已经实现了一个DefaultItemAnimator,它继承自SimpleItemAnimator,而SimpleItemAnimator继承自ItemAnimator,SimpleItemAnimator是一个包装类,用来记录视图范围,决定当前ViewHolder是否执行移动、变化、添加和删除动画,如果想自定义动画可以通过继承SimpleItemAnimator来实现,github上已经有很多优秀的开源动画了,如:
这里只展示一种从左边进入的动画效果,其余大家可以下载下源码查看:
注:这里动画position=1是写死了的,主要是为了方便看效果~
ItemDecoration
ItemDecoration是RecycleView的一个静态内部类,通过对每一个ItemView的边界添加特殊绘制和布局,从而影响每一个ItemView的边界,如绘制分割线、绘制悬浮框等等,ItemDecoration中有三个方法:
1、getItemOffsets()
2、onDraw()
3、onDrawOver()
所有的ItemDecorations绘制都是顺序执行,即:
onDraw() & Item View & onDrawOver(),
onDraw()可以用来绘制divider,但在此之前必须在getItemOffsets设置了padding范围,否则onDraw()的绘制是在ItemView的下面导致不可见;onDrawOver()是绘制在最上层,所以可以用来绘制悬浮框等,下面来看各个方法:
1、getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
内部调用outRect.set(int left, int top, int right, int bottom)来改变ItemView的边界,类似于给ItemView设置Padding,默认getItemOffsets不会影响ItemView的边界,即默认内部调用的是outRect.set(0, 0, 0, 0),如果想得到当前正在修饰的ItemView的位置,可以通过parent.getChildAdapterPosition(view)来获取。
2、onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)
在画布canvas上进行绘制,onDraw()方法是在ItemView被绘制之前执行的,因此onDraw()的绘制是在ItemView下方。
3、onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)
在画布canvas上进行绘制,onDrawOver()方法是在ItemView被绘制之后执行的,因此onDrawOver()的绘制是在ItemView上方,可用来绘制本例中的悬浮框等。
下面介绍下实现本例魅族通讯录的主要思路:
1、自定义ItemDecoration来绘制悬浮框及ItemView之上的分类Tag:
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view);
if (position == 0) {
outRect.set(0, dividerHeight, 0, 0);
} else if (position & 0) {
if (TextUtils.isEmpty(mBeans.get(position).getIndexTag())) return;
if (!mBeans.get(position).getIndexTag().equals(mBeans.get(position - 1).getIndexTag())) {
outRect.set(0, dividerHeight, 0, 0);
public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
int position = ((LinearLayoutManager) (parent.getLayoutManager())).findFirstVisibleItemPosition();
final int bottom = parent.getPaddingTop() + dividerH
mPaint.setColor(Color.WHITE);
canvas.drawRect(parent.getLeft(), parent.getPaddingTop(), parent.getRight() - parent.getPaddingRight(), parent.getPaddingTop() + dividerHeight, mPaint);
mPaint.setTextSize(40);
canvas.drawCircle(DpUtil.dp2px(mContext, 42.5f), bottom - dividerHeight / 2, 35, mPaint);
mPaint.setColor(Color.WHITE);
canvas.drawText(mBeans.get(position).getIndexTag(), DpUtil.dp2px(mContext, 42.5f), bottom - dividerHeight / 3, mPaint);
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
final int childCount = parent.getChildCount();
for (int i = 0; i & childC i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int position = params.getViewLayoutPosition();
if (position == 0) {
drawTitleBar(canvas, parent, child, mBeans.get(position), tagsStr.indexOf(mBeans.get(position).getIndexTag()));
} else if (position & 0) {
if (!mBeans.get(position).getIndexTag().equals(mBeans.get(position - 1).getIndexTag())) {
drawTitleBar(canvas, parent, child, mBeans.get(position), tagsStr.indexOf(mBeans.get(position).getIndexTag()));
2、绘制右侧导航栏:
首先自定义SideBar(SideBar extends View )
绘制最右侧字母:
protected void onDraw(Canvas canvas) {
for (int i = 0; i & indexStr.length(); i++) {
String textTag = indexStr.substring(i, i + 1);
float xPos = (mWidth - mPaint.measureText(textTag)) / 2;
canvas.drawText(textTag, xPos, singleHeight * (i + 1) + DpUtil.dp2px(mContext, TOP_MARGIN), mPaint);
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPaint.setColor(Color.BLACK);
invalidate();
case MotionEvent.ACTION_MOVE:
int position = (int) ((event.getY() - getTop() - DpUtil.dp2px(mContext, 80)) / mHeight * indexStr.toCharArray().length);
if (position &= 0 && position & indexStr.length()) {
((IndexBar) getParent()).setDrawData(event.getY(), String.valueOf(indexStr.toCharArray()[position]), position);
if (listener != null) {
listener.indexChanged(indexStr.substring(position, position + 1));
case MotionEvent.ACTION_UP:
((IndexBar) getParent()).setTagStatus(false);
mPaint.setColor(Color.GRAY);
invalidate();
return true;
SideBar中绘制了导航字母并在onTouchEvent处理了滑动事件,当手指上下滑动时左侧有个圆跟着滑动,这里用的自定义IndexBar( IndexBar extends ViewGroup,IndexBar包含SideBar )来处理的,当SideBar滑动处于MOVE状态时通过((IndexBar) getParent()).setDrawData()把一系列位置参数传到IndexBar中去,:
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int childNum = getChildCount();
if (childNum &= 0) return;
View childView = getChildAt(0);
childWidth = childView.getMeasuredWidth();
childView.layout((mWidth - childWidth), 0, mWidth, mHeight);
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (isShowTag) {
ColorUtil.setPaintColor(mPaint, position);
canvas.drawCircle((mWidth - childWidth) / 2, centerY, circleRadius, mPaint);
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(80);
canvas.drawText(tag, (mWidth - childWidth - mPaint.measureText(tag)) / 2, centerY - (mPaint.ascent() + mPaint.descent()) / 2, mPaint);
主要是在onLayout中把SideBar排列到最右侧,并在onDraw中根据SideBar传过来的一系列位置参数来不断改变圆的位置,这里要注意一下,自定义ViewGroup的onDraw()方法默认是不会调用的,如果想执行onDraw方法,可以通过下面两种方法:
1.设置透明背景:
在构造函数中:setBackgroundColor(Color.TRANSPARENT);
或者在xml中:android:background=”@color/transparent”
2.或者可以在构造函数中添加setWillNotDraw(false);
本文例子中用到的三方库:
本文已收录于以下专栏:
相关文章推荐
现在联系人列表基本都是按照字母或者拼音来进行分类,右边有一排字母供用户快速定位到指定的字母位置,效果图如下:...
主要使用Sticky-Header-RecyclerView实现效果。
效果图:(由于时间原因,未做recyclerview滚动关联索引栏,只实现索引栏控制recyclerview)用法:依赖:compile 'com.android.support:recyclervi...
轮子就算使用的在熟练也是他人的轮子,所以准备做一个重复造轮子系列,丰富自己的知识储备!这一篇讲述的是怎么用RecyclerView实现联系人首字母导航,这个也是很多在项目中也会需要用到的;...
转至:http://blog.csdn.net/u/article/details/
先放效果图
要求做一个通讯录页面,用来存储几千...
Android原生的CalendarView根本无法满足我们日常开发的需要,在开发吾记APP的过程中,我觉得需要来一款高性能且美观简洁的日历控件,觉得魅族的日历风格十分适合,于是打算撸一款。...
flyme5.0增加了很多优美的动画和交互,界面也变得相当精致。我手头现在就用着魅族MX5,感觉还不错哇!经常会打开它的日历看计划等,感觉它首页的滑动效果还不错,就试着实现一把。
上图效果分析1 该首...
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)当前位置:
& 魅族MX4怎么批量删除手机联系人?
魅族MX4怎么批量删除手机联系人?
11:36|编辑:数码猫|来源:265G安卓网
第一次使用魅族手机的网友可能会对Flyme系统有些不习惯,很多魅族MX4的用户都在询问怎么批量删除联系人。其实魅族MX4的Flyme系统中的批量删除联系人功能藏的比较深,下面小编就来给大家详细介绍一下。
flyme4系统的可直接在手机拨号键,点击右下角&&&,选择&账户和联系人管理&,找到批量删除联系人。
还不清楚如何在魅族MX4中批量删除联系人的用户,可以参考下面的组图,已经介绍的非常详细了。
以下就是魅族MX4的Flyme系统中批量删除联系人的方法,只要是Flyme系统,其它的魅族手机也都适用。
扫描二维码关注265G安卓网官方微信公众号,获得更多手机资讯。
QQ用户也可以,和更多小伙伴讨论手机数码相关话题。
6月6日凌晨1点,苹果WWDC2017发布会将在圣何塞McEnery会议中心召开!
265G推荐游戏&的最新主题
因为生意关系,存的联系人多,我只能把一个公司或者某个店里的几个人存在一个联系人名下!比如姓名存的是 魅族公司 电话存了3个人,每个都有相应的名字A
C,假如魅族公司B来电,以前的电话来电显示上边显示 魅族公司
下边小字显示B
紧挨着显示电话号码!& &可是MX5现在只显示 魅族公司
下边显示电话号码,看不出来是A B C谁的来电,只能接通后根据声音判断,有时候会判断错误,造成不必要的麻烦!
希望魅族能改进一下!我是新魅友!或者能设置谁可以告诉一下!谢谢!
补充内容 ( 23:46):
还有mx5来去电和来电时,名字下面会显示备注信息,*时记录的一些信息一股脑出现在屏幕上,晕死!!!我的备注存的联系人银行账号都显示出来!最要命的某些大件配件的价格,写在备注里,一打电话,都出来了!打电话时我都不敢让买东西的人看到我手机屏幕!
不方便,对商务人士!
帮你顶,我帮不了你
谢谢!已经喊错两次人了!心里有阴影了,不敢乱叫了!
谢谢!已经喊错两次人了!心里有阴影了,不敢乱叫了!
或者你找在线客服这个最快,如果能设置解决的她们会马上教你弄
好的!明天就找!
同一个公司的喊错称呼!因为看不到是谁!真的很不方便!
只能是新建几个联系人,分开来保存了,魅族公司A,魅族公司B..
联系人里面添加一个备注,来电话的时候号码后面会显示备注。可以试试
不行的!只能显示存的公司名字,不能显示公司里的谁打的电话!我的一个联系人下边有2个以上电话,还是不同的人,但是属于一个公司,分开存联系人太多了!
找到一个暂时解决的方法!比如存的魅族公司
下边分别是A
C的尾号分别是01& &02& &03
,在备注中注明A01 B02 C03 ,来电时也显示备注,根据尾号+显示的备注判断谁来电!有点麻烦,但是还无奈的办法!期待早日解决这个问题!
这个要支持,好像一直都是只显示公司,甚至早期不勾选公司也不显示,从来没有显示过号码的分类吧。楼主应该截图说明下
截图看一下,联系人截图
楼主你弄错了。。。
分开存每个联系人,编辑联系人的页面不是有一栏填公司么,那里填公司名字就好了,这样就达到了你想要的效果。
17楼是原来的效果18楼是加了备注来电的的效果!根据备注+号码尾号确定谁打得!
现在联系人合并起来都360多个,那样分开存联系人都该有1000多个,找人太麻烦!
确实哦& & 可以去flyme反应一下这个问题
我帮你去flyme提交建议吧
现在联系人合并起来都360多个,那样分开存联系人都该有1000多个,找人太麻烦!不会,你只要公司里输入相关的关键字,这样后期是可以搜索的,不要跟我说你找人是一个个翻过去。。。
BUGME在这些细微的地方做的总差那么一步。这些地方才能更加显示出系统的人性化水*。
谢谢!我的权限不够!
联系人多了不方便!能合并在一起好!
真是某些小的细微之处能体现人性化的水*!
联系人多了不方便!能合并在一起好!没有吧。联系人本来就以人为单位,你可以考虑设置分组,比如给一个公司一个分组啊
还有分组,可以每个公司建一个分组,你现在这样合并了反而更难找人
小的细微之处能体现人性化的水*!
以前可以?
以前可以?什么机器?哪个固件?
顶上攻城湿看到
不是魅族,合约机!
不是魅族,合约机!
上传的图片不符合要求
来自的祝福
网络异常,抽奖失败
(本次不消耗打开红包的次数)

我要回帖

更多关于 魅族设置访问通讯录 的文章

 

随机推荐