Android开发学习之仿手机QQ消息列表侧滑删除效果
今天想和大家分享的是手机QQ消息列表侧滑删除效果,这种效果在IOS中被封装为一个列表控件,而手机QQ则是将这个功能移植到了Android上,换言之,这并非是手机QQ的独创。尽管如此,用户体验依然得到了很大的提升。那么,今天就让我们一起来学习实现这个效果吧。
一、实现原理
给每个ListView的项目中添加一个按钮,这个按钮在默认情况下是隐藏的,当用户接触屏幕后,在OnTouch事件里捕捉用户的行为,按照一定的规则来决定是显示还是隐藏按钮,而当按钮处于显示状态时,我们单击该按钮即可实现对该按钮所在项目的删除。这里我们以手指按下和抬起的横坐标作为判断用户是否滑动手指的标准,当两点间距离的绝对值>25时,即认为用户的手指滑动了,在此条件下,决定隐藏按钮还是显示按钮。
二、基本思路
ListView中每一项的内容是由BaseAdapter中的getView()方法来决定的,因此我们需要根据用户的行为来返回相应的View,所以我们要在适配器中获取列表项中的每一个项目,并对该项目添加OnTouch事件的注册,来决定是否显示这个按钮,而在显示按钮的情况下,我们需要获取这个按钮,并对这个按钮添加OnClick事件的注册,因此基本的思路就是:
1、获取列表中的每一项,为其添加OnTouchListener(),实现OnTouch方法,在OnTouch方法里捕捉用户行为,并做出响应
2、对于显示按钮的项目,为其添加OnClickListener(),实现OnClick方法,在OnClick方法里相应用户的点击,notifyDataSetChanged()使用更新列表
三、具体实现
/*仿 QQ消息滑动删除效果作者:秦元培时间:2013年12月26日这个程序对于手势的识别还不是很好,基本上可以满足要求,但是还需要完善这一部分,例如解决同时点击的问题
*/
package com.Android.SliderToRemove;import java.util.List;
import java.util.Map;import android.content.Context;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;public class ListViewAdapter extends BaseAdapter {public List<Map<String, Object>> mData;private Context mContext;private float mDownX,mUpX;private Button BtnDelete;private boolean IsShowButton;public ListViewAdapter(Context context,List<Map<String,Object>> data) {this.mData = data;this.mContext = context;}@Overridepublic int getCount() {return mData.size();}@Overridepublic Object getItem(int Index) {return mData.get(Index);}@Overridepublic long getItemId(int Index) {return Index;}@Overridepublic View getView(final int mPosition, View mConvertView, ViewGroup parent) {ViewHolder mHolder = null;if (mConvertView == null) {mConvertView = LayoutInflater.from(mContext).inflate(R.layout.layout_item,null);mHolder = new ViewHolder();//HeadermHolder.Header= (ImageView)mConvertView.findViewById(R.id.Image);//ContentmHolder.Content= (TextView)mConvertView.findViewById(R.id.Content);//DeletemHolder.Delete=(Button)mConvertView.findViewById(R.id.Delete);mConvertView.setTag(mHolder);} else {mHolder = (ViewHolder) mConvertView.getTag();}//列表项Touch事件绑定mConvertView.setOnTouchListener(mTouchListener);//列表项中删除按钮的Click事件绑定mHolder.Delete.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {if (BtnDelete != null) {BtnDelete.setVisibility(View.GONE); // 点击删除按钮后,影藏按钮mData.remove(mPosition); // 把数据源里面相应数据删除notifyDataSetChanged(); // 删除数据,加动画}}});//Fuck!这里必须要先进行手势的处理,然后再绑定要显示的内容,否则会出现意外!!!!!mHolder.Header.setBackgroundResource((Integer) mData.get(mPosition).get("Header"));mHolder.Content.setText((CharSequence) mData.get(mPosition).get("Content"));return mConvertView;}OnTouchListener mTouchListener=new OnTouchListener(){@Overridepublic boolean onTouch(View mView, MotionEvent mEvent) {final ViewHolder holder = (ViewHolder)mView.getTag();BtnDelete=holder.Delete;switch (mEvent.getAction()) {case MotionEvent.ACTION_DOWN: mDownX = mEvent.getX(); if(BtnDelete!=null){//如果手指按下和抬起的水平距离的绝对值>25,则认为发生了滑动if (Math.abs(mDownX - mUpX) > 25) { //如果当前按钮是显示,则隐藏,反之,则显示if(IsShowButton){//隐藏按钮的渐变动画HideAnimation(holder.Delete);holder.Delete.setVisibility(View.GONE);IsShowButton=false;}else{//显示按钮的渐变动画ShowAnimation(holder.Delete);holder.Delete.setVisibility(View.VISIBLE);IsShowButton=true;}//获取当前项目中的删除按钮,便于执行下一步BtnDelete = holder.Delete; }}break;case MotionEvent.ACTION_UP: mUpX = mEvent.getX(); break;}return true;}};//显示按钮的渐变动画public void ShowAnimation(View v){Animation Ani_Alpha = new AlphaAnimation(0.1f, 1.0f);Ani_Alpha.setDuration(1000);v.setAnimation(Ani_Alpha);}//隐藏按钮的渐变动画public void HideAnimation(View v){Animation Ani_Alpha = new AlphaAnimation(1.0f, 0.1f);Ani_Alpha.setDuration(1000);v.setAnimation(Ani_Alpha);}static class ViewHolder {ImageView Header;TextView Content; Button Delete; }}
四、最终效果
Android开发学习之仿手机QQ消息列表侧滑删除效果相关推荐
- Android 编程下代码之(QQ消息列表滑动删除)
这份代码写出来有些时候了,一直没共享,现在把它共享给大家.简单列一下代码中你可以学到的知识点: 自定义控件的实现方式: 事件的拦截分发消费机制: QQ会话列表滑动删除原理: 最后附上源码链接:Q ...
- 安卓仿手机QQ消息BadgeView气泡跟随手指移动,并实现进出动画效果。
欢迎加安卓开发交流群:308372687(博主尽可能帮助大家)#安卓仿手机QQ消息BadgeView气泡,跟随手指移动,并实现进出动画效果. 欢迎加安卓开发交流群:308372687(博主尽可能帮助大 ...
- Android的SwipeToDismiss第三方开源框架模拟QQ对话列表侧滑删除,置顶,将头像图片圆形化处理。...
<Android SwipeToDismiss:左右滑动删除ListView条目Item> Android的SwipeToDismiss是github上一个第三方开源框架(github ...
- 使用zepto实现QQ消息左滑删除效果
有这样一个需求: 1. 有一个列表,将每一个列表项左滑动出现删除按钮: 2. 右滑动隐藏删除按钮: 3. 点击这个删除按钮删除该列表项. 完成以后的效果: 这是微信网页端的页面,使用的是 zepto ...
- Android开发之高仿QQ消息侧拉删除
Android开发之高仿QQ消息侧拉删除 QQ消息的侧滑删除效果之炫酷,想必大家都见过吧,本人作为一名安卓开发人员,遇到如此炫酷的效果,怎能不研究一番呢,现本人已实现其基本功能,现将代码贴出,望各位大 ...
- Android开发学习之路-PopupWindow和仿QQ左滑删除
这周作业,要做一个类似QQ的左滑删除效果的ListView,因为不想给每个item都放一个按钮,所以决定用PopupWindow,这里记录一下 先放一下效果图: 先说明一下这里面的问题: ①没有做到像 ...
- android自定义设置界面,Android开发之精仿QQ设置界面(自定义PreferenceActivity)
Android开发之精仿QQ设置界面(自定义PreferenceActivity) 时间:2011-12-05 10:25:06 来源:Android开发者门户 作者: 今天,再给大家分享一下QQ设置 ...
- 仿 手机QQ 登录、注册、找回密码、好友列表、QQ状态等功能的实现
仿 手机QQ 登录.注册.找回密码.好友列表.QQ状态等功能的实现 全文 图 + 代码 .... 福利!!!(QQ登录背景,过度页面背景) 1.加载过程中的背景 2.登录页面 ==1. 登录页面 布局 ...
- 前端大作业-仿手机QQ
简介 此程序是本人大三时期的前端工程大作业,初学前端三件套(HTML.CSS.JavaScript)和Vue后所编写的一个程序,是一个仿手机QQ网页,以前端网页的形式实现手机QQ基本界面和功能. 本程 ...
最新文章
- 获取access中表的相关信息
- 前端笔试题面试题记录(上)
- 公司--保存时验证数据是否保存重复
- Angular 4 辅助路由
- 【数据平台】python中文分词工具jieba
- SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解
- 戴尔新版bios设置中文_戴尔电脑装机过程
- P4700-[CEOI2011]Traffic【tarjan,dp】
- 写屏障是什么_面试官为什么问内存模型总离不开final关键字,该如何应对?
- Redis——多数据库
- 【转】单例模式(Singleton)
- 递归实现指数型枚举(搜索)
- GIBIT墨水屏电子桌牌助力某银行无纸化办公会议系统
- 2019年总结-做时间的朋友
- 机器数的一些知识点 | 计算机网络
- 智能手环core日志获取-兔盯云
- 三十八、西梁女儿国疑案之一落胎泉的秘密
- 群晖NAS搭建测速网站,支持万兆
- 抖音视频真的能赚到钱吗?抖音真的有带货力吗?国仁网络资讯
- Windows XP SP3 IIS HTTP 500 - 内部服务器错误解决