ListView常用拓展(Android群英传)

内容是博主照着书敲出来的,博主码字挺辛苦的,转载请注明出处,后序内容陆续会码出。

  ListView虽然使用广泛,但系统原生的ListView显然是不能满足用户在审美、功能上不断提高的需求。不过也不要紧,Android完全可以定制化,让我们非常方便地对原生ListView进行拓展、修改。于是,在开发者的创新下,ListView越来越丰富多彩,各种各样的基于原生ListView的拓展让人目不暇接。下面来看几个常用的ListView拓展。

具有弹性的ListView

  Android默认的ListView在滚动到顶端或者底端的时候,并没有很好的提示。在Android5.X中,Google为这样的行为只添加了一个半月形的阴影效果,如下图所示。


顶部阴影效果

  而在iOS系统中,列表都是具有弹性效果的,即滚动到底端或者顶端后会继续往下或者往上滑动一段距离。不得不说,这样的设计的确更加的友好,虽然不知道Google为什么不模仿这样的设计,但我们可以自己修改ListView,让ListView也可以“弹性十足”。
  网上有很多通过重写ListView来实现弹性效果的方法,比如增加HeaderView或者使用ScrollView进行嵌套,方法有很多,不过这里可以使用一种非常简单的方法来实现这个效果。虽然不如那些方法可定制化高、效果丰富,但主要目的是让读者朋友们学会如何从源代码中找到问题的解决办法。
  我们在查看ListView源代码的时候可以发现,ListView中有一个控制滑动到边缘的处理方法,如下所示。

protected boolean overScrollBy(int deltaX, int deltaY,
                               int scrollX, int scrollY,
                               int scrollRangeX, int scrollRangeY,
                               int maxOverScrollX, int maxOverScrollY,
                               boolean isTouchEvent)

  可以看见这样一个参数:maxOverScrollY,注释中这样写道——Number of pixels to overscroll by in either direction along the Y axis。由此可以发现,虽然它的默认值是0,但其实只要修改这个参数的值,就可以让ListView具有弹性了!所以,既然我们不知道为什么Google不采用这样的修改,那我们就自己来修改一下吧。重写这个方法,并将maxOverScrollY改为设置的值——mMaxOverDistance,代码如下所示。

@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
    return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverDistance, isTouchEvent);
}

  这样,通过对这个值得修改,就实现了一个具有弹性的ListView了。效果如下图所示。


弹性ListView效果

  当然,为了能够满足多分辨率的需求,我们可以在修改maxOverScrollY值的时候,可以通过屏幕的density来计算具体的值,让不同分辨率的弹性距离基本一致,代码如下所示。

private void initView() {
    DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
    float density = metrics.density;
    mMaxOverDistance = (int) (density * mMaxOverDistance);
}

自动显示、隐藏布局的ListView

  相信通过Google+的朋友应该非常熟悉这样一个效果:当我们在ListView上滑动的时候,顶部的ActionBar或者Toolbar就会相应的隐藏或者显示。这样的效果一出现,各种App竞相模仿,不得不说,Google的应用一直都是Android设计的风向标。
  大家可以发现,在滚动前界面上加载了上方的标题栏和右下角的悬浮编辑按钮,如下图所示。


滚动前界面

  当用户向下滚动时,标题栏和悬浮按钮消失了,让用户有更大的空间去阅读,如下图所示。

滚动后界面

  下面我们就来仿照这个例子设计一个类似的效果。
  我们知道,让一个布局显示或者隐藏并带有动画效果,可以通过属性动画来很方便地实现,所以这个效果的关键就在于如何获得ListView的各种滑动事件。所以借助View的OnTouchListener接口来监听ListView的滑动,通过比较与上次坐标的大小,来判断滑动的方向,并通过滑动的方向来判断是否需要显示或隐藏对应的布局。在开始判断滑动事件之前,我们还要做一些准备工作,首先需要给ListView增加一个HeaderView,避免第一个Item被Toolbar遮挡,代码如下所示。

View header = new View(this);
header.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
        (int) getResources().getDimension(R.dimen.abc_action_bar_default_height_material)));
mListView.addHeaderView(header);

  在代码中,通过使用abc_action_bar_default_height_material属性获取系统Actionbar的高度,并设置给HeaderView。另外,定义一个mTouchSlop变量来获取系统认为的最低滑动距离,即超过这个距离的移动,系统就将其定义为滑动状态了,对这个值得获取非常简单,代码如下所示。


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值