双击回到顶部在Android应用中用的很多,众所周知的微信消息列表,朋友圈都提供这样的效果,下面我将自己自项目中的实践记录下来,分享给大家

首先:获取双击事件

网上有很多的获取双击事件的方法,这里我讲它稍加封装,整个工程也可以使用

首先我们来定义双击事件的接口

packagecom.....activity.info;

importandroid.view.View;

/**

* @author wfy

* 单击双击事件接口

*/

publicinterfaceOnDoubleClickListener {

publicvoidOnSingleClick(View v);

publicvoidOnDoubleClick(View v);

}

下来定义一个DoubleClick类,它提供一个静态方法给一个view注册双击事件,注释我已经写的及其详细了,不再多说

packagecom.....activity.info;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.view.View;

/**

* @author wfy

* 消息列表+好友动态的双击回到顶部

*/

publicclassDoubleClick {

publicstaticvoidregisterDoubleClickListener(View view,finalOnDoubleClickListener listener){

if(listener==null)return;

view.setOnClickListener(newView.OnClickListener() {

//双击间隔时间350毫秒

privatestaticfinalintDOUBLE_CLICK_TIME =350;

privatebooleanflag =true;

privateHandler handler =newHandler(){

@Override

publicvoidhandleMessage(Message msg) {

listener.OnSingleClick((View)msg.obj);

}

};

//等待双击

publicvoidonClick(finalView v) {

if(flag){

flag = false;//与执行双击事件

newThread(){

publicvoidrun() {

try{

Thread.sleep(DOUBLE_CLICK_TIME);

//此时线程沉睡 而flag被修改为false  在DOUBLE_CLICK_TIME内点击则 进入else

} catch(InterruptedException e) {

e.printStackTrace();

}    //等待双击时间,否则执行单击事件

if(!flag){

//睡醒了看一看flag被人动过没,没有人动,则认作单击事件

//因此不建议用此方法执行单击事件 因为会等待睡醒,有点击延迟的存在

//没有人动,自己把它改成true,以接受下次点击

flag = true;

Message msg = handler.obtainMessage();

msg.obj = v;

//发个消息,让执行单击

handler.sendMessage(msg);

}

}

}.start();

}else{

flag = true;

listener.OnDoubleClick(v);    //执行双击

}

}

});

}

}

其次:给你要双击的组件注册双击事件,此处用button演示一下

Button button=newButton(this);

DoubleClick.registerDoubleClickListener(button, newOnDoubleClickListener() {

@Override

publicvoidOnSingleClick(View v) {

// TODO Auto-generated method stub

}

@Override

publicvoidOnDoubleClick(View v) {

// TODO Auto-generated method stub

GoTopTask task=newGoTopTask();

task.execute(firstposition);

}

});

最后:细心的会发现,在上面的OnDoubleClick方法中我启动了一个异步任务,下面贴出代码,这是一个内部类

privateclassGoTopTaskextendsAsyncTask{

@Override

protectedvoidonPreExecute() {

//回到顶部时间置0  此处的时间不是侠义上的时间

time=0;

super.onPreExecute();

}

@Override

protectedString doInBackground(Integer... params) {

// TODO Auto-generated method stub

for(inti=params[0];i>=0;i--){

publishProgress(i);

//返回顶部时间耗费15个item还没回去,则直接去顶部

//目的:要产生滚动的假象,但也不能耗时过多

time++;

if(time>15){

publishProgress(0);

returnnull;

}

try{

Thread.sleep(5);

} catch(InterruptedException e) {

e.printStackTrace();

}

}

returnnull;

}

@Override

protectedvoidonProgressUpdate(Integer... values) {

lv.setSelection(values[0]);

super.onProgressUpdate(values);

}

@Override

protectedvoidonPostExecute(String result) {

super.onPostExecute(result);

}

@Override

protectedvoidonCancelled() {

// TODO Auto-generated method stub

super.onCancelled();

}

}

写到这里相信大家都明白思路了,就是用lv.setSelection(0)让list回到顶部,可是这里存在三个问题:1、直接闪回到顶部用户体验不是很好,很突兀   2、如1所说,那一个个往会显示,可是你有1000个item,我看到好几百个时,往回一个一个滚吗?相信没有人有那个耐心等   3、不能每次都从最后往会滚,从当前可见的第一个item滚,那么如何获取当前可见的第一个item?

对于第一个问题和第二个问题:我在异步任务里已经做了判断,先一个一个滚,滚到第十五个(也就是异步任务里的time)还没回去则直接回顶部,这样既有了滚动的动作,也不会因为有好多item让用户等待太久

对于第三个问题:首先在当前的activity里定义一个静态的变量,用来持续追踪当前可见的第一个item,然后通过监听lv滚动事件实时修改firstposition,这里贴出代码

lv.setOnScrollListener(newOnScrollListener() {

@Override

publicvoidonScrollStateChanged(AbsListView view,intscrollState) {

// TODO Auto-generated method stub

}

@Override

publicvoidonScroll(AbsListView view,intfirstVisibleItem,

intvisibleItemCount,inttotalItemCount) {

// TODO Auto-generated method stub

firstposition=firstVisibleItem;

}

});

好了,到这里就大功告成了,是不是很简单,之所以写的很详细,是想让看的人理解,而不是仅仅copy我的code,理解了就是自己的,方法很重要。

android双击回到顶部,Android之双击回到顶部相关推荐

  1. android 点击返回顶部,Android scrollToTop实现点击回到顶部(兼容PullTorefreshScrollview)...

    前言 最近因为项目组需求,特研究了一下"回到顶部"效果,即:页面里有scrollview,内容很多,当滑动到页面下面或者更深时,需要回到顶部,即可点击出现的按钮,省得回滑N久.我没 ...

  2. Android Native APP开发笔记:双击返回键退出应用单击返回键返回桌面

    文章目录 目的 基础说明 双击返回键退出应用 单击返回键回到桌面 总结 目的 双击返回键退出应用 很早之前就是Android中非常常见的一种功能,而目前好多安卓应用为了应用常驻都改为使用 单击返回键返 ...

  3. android 通知打开app,Android打开通知栏并回到主页的几种方式

    用PendingIntent.getActivity创建通知栏 在MainActivity中增加点击事件,用来启动NotifyService和延迟2秒销毁MainActivity,如下面代码所示 In ...

  4. Android 页面跳转时发生双击导致app闪退的解决方案

    在页面跳转时双击双击,查阅了各种资料 尝试一:从双击事件出发,避免双击事件 例如重写onClick事件 public abstract class NoDoubleClickListener impl ...

  5. android 自定义顶部,Android自定义实现顶部粘性下拉刷新效果

    本文实例为大家分享了Android实现顶部粘性下拉刷新效果的具体代码,供大家参考,具体内容如下 activity_view_mv代码 xmlns:android="http://schema ...

  6. android 仿搜索动画,Android仿京东顶部搜索框滑动伸缩动画效果

    最近使用京东发现,京东顶部的搜索框有一个新的伸缩效果,根据用户的手势滑动,伸缩搜索框.觉得效果还不错,就看了下其他的应用有没有这种伸缩的效果,发现安居客也使用了类似的一种效果,然后就想着实现这样的一种 ...

  7. Android ActionBar的Overlay模式如何不遮盖顶部内容的问题

    关于actionbar的overlay模式请参考 如何让android的actionbar浮动且透明 一文.这篇文章讲的是如何在这种模式下让actionbar不遮住顶部的内容. 这 一般是这样的场景, ...

  8. Android底部菜单栏、Android沉浸式状态栏(顶部状态栏修改颜色)、自定义标题栏

    0.简介: 没有使用TabHost切换,而是变成FragmentActivity替换Fragment:沉浸式引用的git上面的jar包. 先看图片 1.底部导航栏 核心代码 <span styl ...

  9. android 悬停浮动框,Android滑动到顶部悬停

    无图说卵,先上图 jianshu-top.gif 查阅资料后,发现网上大部分都是用这种方法实现的: 多写一个和需要悬浮的部分一模一样的layout,先把浮动区域的可见性设置为gone.当浮动区域滑动到 ...

  10. 【Android开发】使用Bottom Navigation Activity去掉顶部栏(标题栏)

    [Android开发]使用Bottom Navigation Activity去掉顶部栏(标题栏)    在使用android自带的模板Botton Navigation Activity后,页面顶部 ...

最新文章

  1. k3应付系统初始化应付票据_在家工作时应付无尽干扰的真实感觉
  2. 2019年雁栖湖会议重大科学问题面向全球发布
  3. 用python做数据分析,安装包一次到位
  4. python 桌面应用 启动缓慢_如何加快Python 应用的启动时间
  5. Python+BI爬取3000条车厘子数据,发现了这些秘密
  6. Windbg命令学习9,经典死锁(!cs和~~[TID])
  7. QT绘图底层是如何适配各种操作系统的
  8. CREO:CREO软件之零件【模型】扫描之扫描、螺旋扫描、可变剖面扫描、扫描混合、混合、边界混合、可变剖面扫描的简介及其使用方法(图文教程)之详细攻略
  9. python混合线性模型_如何在Python statsmodels中有多组线性混合效应模型?
  10. 中心极限定理 - 正态分布
  11. 2020年7月杭州更换异地驾照
  12. UE4 使用自发光材质作为烘焙光源
  13. 【送书活动第二话】:共10本技术书籍送! 送!! 送!!!
  14. 示波器X1探头和X10探头
  15. 产品版本、软件版本、文档版本定义
  16. scp免密码传送文件
  17. 企业微信服务商扫码登录
  18. AI模型看看视频,就学会了玩《我的世界》:砍树、造箱子、制作石镐样样不差...
  19. RabbitMQ几种工作模式,实现延时消息的两种案例
  20. Vue 开发 Lov 组件

热门文章

  1. 制作windows7虚拟机镜像并配置网络
  2. c语言初学者程序,C语言初学者必懂的100个范例程序
  3. 运筹学_单纯形法_week3
  4. 天勤计算机考研高分笔记(一)绪论1数据结构
  5. android 电影院订票系统 论文,基于Android平台的电影票订票系统的设计与实现
  6. 笔记本电脑华硕N56VZ的几种螺丝规格
  7. 各大市场应用上架整理
  8. PLC数据采集解决方案,BCNet数据采集
  9. 模式识别与智能系统类毕业论文文献都有哪些?
  10. 使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)[搜片神器]