0.  前言

Android中的ListView是用的比较多的控件之一,在上一篇Android开发——ListView使用技巧总结(一)中对ListView的ViewHolder机制、优化卡顿方式以及使用ListView加载不同布局的方式进行了总结。这篇将主要介绍如何做出一个具有弹性的ListView以及如何在合适的实际隐藏Toolbar以让用户获得更多的阅读空间。

1.  具有弹性的ListView

弹性滑动是指当ListView滑动到底端时,会继续往下滑动一段距离,顶端同理。这里有一个比较容易的实现方法。因为在ListView中有一个控制滑动到边缘的处理方法,即overScrollBy():

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

其中倒数第二个参数maxOverScrollY即为控制overscroll在Y轴方向上的像素值,默认为0,我们可以通过直接改变该值使ListView在上下滑动到边缘时具有弹性。完整代码如下:

public class FlexibleListView extends ListView {
private static int mMaxOverDistance = 30;
private Context mContext; public FlexibleListView(Context context, AttributeSet attrs,int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
initView();
} public FlexibleListView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
initView();
} public FlexibleListView(Context context) {
super(context);
this.mContext = context;
initView();
}
//sp2dp
private void initView() {
DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
float density = metrics.density;
mMaxOverDistance = (int) (density * 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);//强制返回30个像素值对应机型的dp值
}
}

2.  如何实时的隐藏Toolbar

苹果手机上的Safari浏览器有这样一个功能,是当你向下滑动界面时,底部的状态栏就会实时的隐藏,从而使用户获得更大的空间去阅读,而再向上滑动时,底部状态栏才会实时显示。Toolbar也是同理,这里我们实现一个类似的功能,即在用户向下滑动时,隐藏Toolbar,反之显示,这要怎么实现呢?

首先设置一个监听器,来判断手势是向上滑动还是向下滑动:

View.OnTouchListener myTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mFirstY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurrentY = event.getY();
if (mCurrentY - mFirstY > mTouchSlop) {
direction = 0;// down
} else if (mFirstY - mCurrentY > mTouchSlop) {
direction = 1;// up
}
if (direction == 1) {
if (mShow) {
toolbarAnim(1);//hide
mShow = !mShow;
}
} else if (direction == 0) {
if (!mShow) {
toolbarAnim(0);//show
mShow = !mShow;
}
}
break;
case MotionEvent.ACTION_UP:
break;
}
return false;
}
};

ActionBar的隐藏和显示也很简单,使用属性动画即可:

private void toolbarAnim(int flag) {
if (mAnimator != null && mAnimator.isRunning()) {
mAnimator.cancel();
}
if (flag == 0) {
mAnimator = ObjectAnimator.ofFloat(mToolbar, "translationY", mToolbar.getTranslationY(), 0);
} else {
mAnimator = ObjectAnimator.ofFloat(mToolbar, "translationY", mToolbar.getTranslationY(), -mToolbar.getHeight());
}
mAnimator.start();
}

接着为ListView设置HeadView,作用是防止ActionBar将界面上的第一个条目覆盖。

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

最后初始化ListView的数据并设置一个简单的Adapter。

for (int i = 0; i < mStr.length; i++) {
mStr[i] = "Item " + i;
}
mListView.setAdapter(new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, mStr));
mListView.setOnTouchListener(myTouchListener);

效果如下所示,还是不错的,完整源码地址点击下载

对ListView的使用技巧就总结这么多吧,一共两篇6个点,快点拿起你的小本本记录一下吧~

最后请大家多点赞支持~

Android开发——ListView使用技巧总结(二)的更多相关文章

  1. Android开发——ListView使用技巧总结(一)

    )还有一点就是要控制异步任务的执行频率,因为当用户频繁的上下滑动,会瞬间产生上百个异步任务,会带来无意义的大量的UI更新操作,因此可以考虑在列表滑动时停止进行异步任务,直到列表停下来. //判断列表的 ...

  2. Android开发艺术探索笔记——View(二)

    Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...

  3. Android之ListView常用技巧

    ListView是一个非常常用的列表控件,虽然在5.x时代ListView的风头正在逐渐的被RecyclerView抢去,但是ListView的使用范围依然十分广泛. 接下来的ListView的常用技 ...

  4. Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用

    前言 啦啦啦各位小伙伴们许久不见了~学期末和过年期间自己忙着做其他事没能及时更新Android开发系列课程的博客,实在是罪过罪过~ 好啦~废话不多说,进入我们今天的主题.今天我们将和大家学习其他的数据 ...

  5. Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局

    一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...

  6. Android开发ListView嵌套ImageView实现单选按钮

    做Android开发两年的时间,技术稍稍有一些提升,刚好把自己实现的功能写出来,记录一下,如果能帮助到同行的其他人,我也算是做了件好事,哈哈!!废话不多说,先上个图. 先上一段代码: if (last ...

  7. ★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

    例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import ja ...

  8. Android开发ListView使用OnScrollListener实现分页加载数据

    上篇博文和大家分享了下拉刷新,这是一个用户体验很好的操作方式.新浪微薄就是使用这样的方式的典型. 还有个问题,当用户从网络上读取微薄的时候.假设一下子所有载入用户未读的微薄这将耗费比較长的时间,造成不 ...

  9. Android开发-Listview中显示不同的视图布局

    1. 使用场景 在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够 ...

随机推荐

  1. 遇到npm报错read ECONNRESET怎么办

    遇到npm 像弱智一样报错怎么办 read ECONNRESET This is most likely not a problem with npm itselft 'proxy' config i ...

  2. [20170909]为什么是12秒.txt

    [20170909]为什么是12秒.txt --//在开发程序时我一般会强调开发尽量不要写一些自定义函数,往往可能导致CPU忙.--//例子很像这样: CREATE OR REPLACE FUNCTI ...

  3. 非对称加密与GPG/PGP

    最近浏览博客的时候,经常会看到博主展示出自己的公钥,于是对 GPG/PGP 产生兴趣.下面简单记录相关文章的链接,方便以后了解. 简介: 1991年,程序员Phil Zimmermann为了避开政府的 ...

  4. Servlet (HttpServletResponse)对象

    1.setStatus(int status)方法:用于设置HTTP响应消息的状态码,并生成响应状态行.响应状态行中的状态描述信息直接与状态码相关,HTTP版本由服务器确定,因此只需要通过这个方法设置 ...

  5. js获取子节点和修改input的文本框内容

    js获取子节点和修改input的文本框内容 js获取子节点: $("#"+defaultPVItemId).children().eq(3); //获取某个选择器下的第四个子节点 ...

  6. Zabbix3.x 监控磁盘IO与自定义模板

    引言 Zabbix自带的模板,帮助我们完成了一些比较常用的监控.但如果想要监控磁盘的IO,zabbix并没有给我们提供这么一个模板,所以我们需要自己来创建一个模板来完成磁盘IO的监控. 操作步骤 1. ...

  7. 【PAT】B1063 计算谱半径(20 分)

    水题,没有难点 #include<stdio.h> #include<algorithm> #include<math.h> using namespace std ...

  8. 6.1Python文件的操作(一)

    目录 目录 前言 (一)基础类型 ==1.只读== ==2.只写== ==3.追加== (二)b二进制组合 ==1.读写二进制文件== (三)+ 附加组合 ==1.读附加== ==2.写附加== == ...

  9. Hive-1.2.1_05_案例操作

    1. 建库建表 # 建库 create database exercise; # 建表 create table student(Sno int,Sname string,Sex string,Sag ...

  10. Docker容器学习与分享01

    1.什么是容器? 容器技术是一种虚拟化的方案,与传统的虚拟机不同,传统的虚拟机是通过中间层将一台或多台独立的机器虚拟运行于物理硬件之上,而容器是直接运行在操作系统内核之上的用户空间. 所以容器虚拟化又 ...