Android开发——ListView使用技巧总结(二)
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使用技巧总结(二)的更多相关文章
- Android开发——ListView使用技巧总结(一)
		
)还有一点就是要控制异步任务的执行频率,因为当用户频繁的上下滑动,会瞬间产生上百个异步任务,会带来无意义的大量的UI更新操作,因此可以考虑在列表滑动时停止进行异步任务,直到列表停下来. //判断列表的 ...
 - Android开发艺术探索笔记——View(二)
		
Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...
 - Android之ListView常用技巧
		
ListView是一个非常常用的列表控件,虽然在5.x时代ListView的风头正在逐渐的被RecyclerView抢去,但是ListView的使用范围依然十分广泛. 接下来的ListView的常用技 ...
 - Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用
		
前言 啦啦啦各位小伙伴们许久不见了~学期末和过年期间自己忙着做其他事没能及时更新Android开发系列课程的博客,实在是罪过罪过~ 好啦~废话不多说,进入我们今天的主题.今天我们将和大家学习其他的数据 ...
 - Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局
		
一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...
 - Android开发ListView嵌套ImageView实现单选按钮
		
做Android开发两年的时间,技术稍稍有一些提升,刚好把自己实现的功能写出来,记录一下,如果能帮助到同行的其他人,我也算是做了件好事,哈哈!!废话不多说,先上个图. 先上一段代码: if (last ...
 - ★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)
		
例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import ja ...
 - Android开发ListView使用OnScrollListener实现分页加载数据
		
上篇博文和大家分享了下拉刷新,这是一个用户体验很好的操作方式.新浪微薄就是使用这样的方式的典型. 还有个问题,当用户从网络上读取微薄的时候.假设一下子所有载入用户未读的微薄这将耗费比較长的时间,造成不 ...
 - Android开发-Listview中显示不同的视图布局
		
1. 使用场景 在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够 ...
 
随机推荐
- loadrunner 场景设计-添加Windows Resources计数器
			
场景设计-添加Windows Resources计数器 by:授客 QQ:1033553122 目的 监控要测试的windows服务器的资源使用情况 步骤 1.添加视图,方法双击.拖动左侧的Windo ...
 - Flutter 不一样的跨平台解决方案
			
本文主要介绍Flutter相关的东西,包括Fuchsia.Dart.Flutter特性.安装以及整体架构等内容. 1. 简介 Flutter作为谷歌最近推出的跨平台开发框架,一经推出便吸引了不少注意. ...
 - MagicApp说明
			
title: MagicApp说明 date: 2017-12-06 05:41:00 tags: IT 技术 MagicApp是日常处理的程序,协助进行日常工作处理 批量重命名模块 说明 该模块是根 ...
 - gnome extensions 推荐 (fedora 28 常用gnome 插件备份)
			
当我们进行重新安装系统(fedora 28)的时候,需要初始安装一些 gnome 插件,来进行完善我们的使用. 首先我们应该进行安装 gnome-tweak 工具来进行定制化系统. tweak 可以进 ...
 - 【PAT】B1063 计算谱半径(20 分)
			
水题,没有难点 #include<stdio.h> #include<algorithm> #include<math.h> using namespace std ...
 - iris数据集(.csv .txt)免费下载
			
我看CSDN下载的iris数据集都需要币,我愿意免费共享,希望下载后的朋友们给我留个言 分享iris数据集(供学习使用): 链接: https://pan.baidu.com/s/1Knsp7zn-C ...
 - Unity3D中自带事件函数的执行顺序
			
在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行.其执行顺序如下: 编辑器(Editor) Reset:Reset函数被调用来初始化脚本属性当脚本第一次被附到对 ...
 - 转://Linux下区分物理CPU、逻辑CPU和CPU核数
			
㈠ 概念 ① 物理CPU 实际Server中插槽上的CPU个数 物理cpu数量,可以数不重复的 p ...
 - 不可不知 DDoS的攻击原理与防御方法
			
DoS攻击.DDoS攻击和DRDoS攻击相信大家已经早有耳闻了吧!DoS是Denial of Service的简写就是拒绝服务,而DDoS就是Distributed Denial of Service ...
 - PHP中使用CURL实现GET和POST请求数据
			
PHP中使用CURL实现GET和POST请求 一.什么是CURL? cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 ...