转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/22961279

在CSDN上开了很多大神们的文章,感觉受益良多,也非常欣赏大家的分享态度,所以决定开始写Blog,给大家分享自己的心得。

本来准备在ListView的每个Item的布局上设置一个隐藏的Button,当滑动的时候显示。但是因为每次只要存在一个Button,发现每个Item上的Button相互间不好控制。所以决定继承ListView然后结合PopupWindow。

首先是布局文件:

delete_btn.xml:这里只需要一个Button

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical" ><Button android:id="@+id/id_item_btn"android:layout_width="60dp"android:singleLine="true"android:layout_height="wrap_content"android:text="删除"android:background="@drawable/d_delete_btn"android:textColor="#ffffff"android:paddingLeft="15dp"android:paddingRight="15dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="15dp"/>
</LinearLayout>

主布局文件:activity_main.xml ,ListView的每个Item的样式直接使用了系统的android.R.layout.simple_list_item_1

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><com.example.listviewitemslidedeletebtnshow.QQListViewandroid:id="@+id/id_listview"android:layout_width="fill_parent"android:layout_height="wrap_content" ></com.example.listviewitemslidedeletebtnshow.QQListView></RelativeLayout>

接下来看看QQListView的实现:

package com.example.listviewitemslidedeletebtnshow;import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;public class QQListView extends ListView
{private static final String TAG = "QQlistView";// private static final int VELOCITY_SANP = 200;// private VelocityTracker mVelocityTracker;/*** 用户滑动的最小距离*/private int touchSlop;/*** 是否响应滑动*/private boolean isSliding;/*** 手指按下时的x坐标*/private int xDown;/*** 手指按下时的y坐标*/private int yDown;/*** 手指移动时的x坐标*/private int xMove;/*** 手指移动时的y坐标*/private int yMove;private LayoutInflater mInflater;private PopupWindow mPopupWindow;private int mPopupWindowHeight;private int mPopupWindowWidth;private Button mDelBtn;/*** 为删除按钮提供一个回调接口*/private DelButtonClickListener mListener;/*** 当前手指触摸的View*/private View mCurrentView;/*** 当前手指触摸的位置*/private int mCurrentViewPos;/*** 必要的一些初始化* * @param context* @param attrs*/public QQListView(Context context, AttributeSet attrs){super(context, attrs);mInflater = LayoutInflater.from(context);touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();View view = mInflater.inflate(R.layout.delete_btn, null);mDelBtn = (Button) view.findViewById(R.id.id_item_btn);mPopupWindow = new PopupWindow(view, LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);/*** 先调用下measure,否则拿不到宽和高*/mPopupWindow.getContentView().measure(0, 0);mPopupWindowHeight = mPopupWindow.getContentView().getMeasuredHeight();mPopupWindowWidth = mPopupWindow.getContentView().getMeasuredWidth();}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev){int action = ev.getAction();int x = (int) ev.getX();int y = (int) ev.getY();switch (action){case MotionEvent.ACTION_DOWN:xDown = x;yDown = y;/*** 如果当前popupWindow显示,则直接隐藏,然后屏蔽ListView的touch事件的下传*/if (mPopupWindow.isShowing()){dismissPopWindow();return false;}// 获得当前手指按下时的item的位置mCurrentViewPos = pointToPosition(xDown, yDown);// 获得当前手指按下时的itemView view = getChildAt(mCurrentViewPos - getFirstVisiblePosition());mCurrentView = view;break;case MotionEvent.ACTION_MOVE:xMove = x;yMove = y;int dx = xMove - xDown;int dy = yMove - yDown;/*** 判断是否是从右到左的滑动*/if (xMove < xDown && Math.abs(dx) > touchSlop && Math.abs(dy) < touchSlop){// Log.e(TAG, "touchslop = " + touchSlop + " , dx = " + dx +// " , dy = " + dy);isSliding = true;}break;}return super.dispatchTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent ev){int action = ev.getAction();/*** 如果是从右到左的滑动才相应*/if (isSliding){switch (action){case MotionEvent.ACTION_MOVE:int[] location = new int[2];// 获得当前item的位置x与ymCurrentView.getLocationOnScreen(location);// 设置popupWindow的动画mPopupWindow.setAnimationStyle(R.style.popwindow_delete_btn_anim_style);mPopupWindow.update();mPopupWindow.showAtLocation(mCurrentView, Gravity.LEFT | Gravity.TOP,location[0] + mCurrentView.getWidth(), location[1] + mCurrentView.getHeight() / 2- mPopupWindowHeight / 2);// 设置删除按钮的回调mDelBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){if (mListener != null){mListener.clickHappend(mCurrentViewPos);mPopupWindow.dismiss();}}});// Log.e(TAG, "mPopupWindow.getHeight()=" + mPopupWindowHeight);break;case MotionEvent.ACTION_UP:isSliding = false;}// 相应滑动期间屏幕itemClick事件,避免发生冲突return true;}return super.onTouchEvent(ev);}/*** 隐藏popupWindow*/private void dismissPopWindow(){if (mPopupWindow != null && mPopupWindow.isShowing()){mPopupWindow.dismiss();}}public void setDelButtonClickListener(DelButtonClickListener listener){mListener = listener;}interface DelButtonClickListener{public void clickHappend(int position);}}

代码注释写得很详细,简单说一下,在dispatchTouchEvent中设置当前是否响应用户滑动,然后在onTouchEvent中判断是否响应,如果响应则popupWindow以动画的形式展示出来。当然屏幕上如果存在PopupWindow则屏幕ListView的滚动与Item的点击,以及从右到左滑动时屏幕Item的click事件。

接下来是MainActivity.java,这里代码很简单不做介绍了。

package com.example.listviewitemslidedeletebtnshow;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Toast;import com.example.listviewitemslidedeletebtnshow.QQListView.DelButtonClickListener;public class MainActivity extends Activity
{private QQListView mListView;private ArrayAdapter<String> mAdapter;private List<String> mDatas;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mListView = (QQListView) findViewById(R.id.id_listview);// 不要直接Arrays.asListmDatas = new ArrayList<String>(Arrays.asList("HelloWorld", "Welcome", "Java", "Android", "Servlet", "Struts","Hibernate", "Spring", "HTML5", "Javascript", "Lucene"));mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mDatas);mListView.setAdapter(mAdapter);mListView.setDelButtonClickListener(new DelButtonClickListener(){@Overridepublic void clickHappend(final int position){Toast.makeText(MainActivity.this, position + " : " + mAdapter.getItem(position), 1).show();mAdapter.remove(mAdapter.getItem(position));}});mListView.setOnItemClickListener(new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id){Toast.makeText(MainActivity.this, position + " : " + mAdapter.getItem(position), 1).show();}});}
}

效果图如下:楼主使用asm.jar以及gifcamera截的gif,由于button的动画很短感觉截图效果很卡不流畅,大家有什么好的截图,还望推荐。有兴趣的还是下载源码看看效果i。

源码下载,点击这里

ListView滑动删除 ,仿腾讯QQ相关推荐

  1. 仿腾讯QQ竖直滑动导航菜单

    菜单就像qq软件的分组,鼠标经过自动显示相应组的内容. 效果体验网址:http://keleyi.com/a/bjad/nf86w2dv.htm 以下是源代码: 1 <html> 2 &l ...

  2. ListView滑动删除效果实现

    通过继承ListView然后结合PopupWindow实现 首先是布局文件: delete_btn.xml:这里只需要一个Button <?xml version="1.0" ...

  3. C# 高仿腾讯QQ (TextBox控件美化)(附源码)

    接上一篇<C# 高仿腾讯QQ (Bottom控件美化) > 这篇来说一下QQ皮肤TextBox控件的美化: (1).已修正 每次窗口最小化以后再还原会发现窗口底部往下移了几十个像素(但还不 ...

  4. 高仿腾讯 QQ,已经实现了纯文本,表情,图片,语音,位置等信息的发送。

    QQ 项目地址:HuTianQi/QQ 简介:高仿腾讯 QQ,已经实现了纯文本,表情,图片,语音,位置等信息的发送. 一款高仿腾讯 QQ 的 IM 软件,基于 bmob SDK,已经实现聊天,表情,图 ...

  5. Android ListView滑动删除及响应事件详解

    目标:实现类似QQ,微信的消息列表滑动删除 具体操作: 1. 主页面布局 首先在布局文件(本例是activity_main.xml)中引入ListView控件,并指定id(如下代码中黑体部分). &l ...

  6. 仿 qq登录界面 php,js仿腾讯QQ的web登陆界面

    用了腾讯QQ也有将近十年了,今天心血来潮想模仿腾讯QQ的登陆面板做一个web版的登陆面板,然后参考了一些代码,自己模仿,学写了一个. 效果如下: 其中还实现了拖动面板,选择状态的效果 下面是具体代码: ...

  7. 高仿腾讯QQ Xplan(X计划)的H5页面(2):动画控制

    上一篇知道如何制作threejs地球之后,就正式coding了,当然还是使用最心爱的Vue.本篇会有一些代码,但是都是十几行的独立片段,相信你不用担心. 布局 在进入本篇主题前,要简单看一下xplan ...

  8. C# 高仿腾讯QQ (实现QQ好友列表-基于ListBox的绘法)

    C#实现QQ好友列表,一直是我网上百搜却不得其解的控件,几乎找不到相关的信息,而找到的也不是我想要的那种.不过,曾在CSDN上看过到过网上一位大牛用C++实现QQ好友列表这种效果,当然,对于我这个C+ ...

  9. html5仿腾讯,高仿腾讯QQ Xplan(X计划)的H5页面(1):threejs创建地球

    上个月底,在朋友圈看到一个号称"这可能是地球上最美的h5"的分享,点进入后发现这个h5还很别致,思考了一会,决定要不高仿一个? 到今天为止,高仿基本完成, 除了手机端的media控 ...

最新文章

  1. 猫哥教你写爬虫 046--协程-实践-吃什么不会胖
  2. Linux内核网络设备驱动
  3. hbase启动后在log中出现cannot get log writer
  4. openstack一键安装脚本(转载)
  5. PHP如何读取excel文,PHP-php如何读取excel?
  6. HTML5个人求职简历模板下载
  7. HTML学习二_HTML常用的行级标签,常用实体字符及表单标签
  8. 【作业报告】作业5 四则运算 测试与封装 5.2(已更新)
  9. 精通git中文版 (连载四)
  10. Linux 压缩(打包)文件夹 tar/zip
  11. 河北档案费2016年取消
  12. Editor\Data\il2cpp/build/deploy/net471/il2cpp.exe did not run properly!
  13. 牛!程序媛一口气拿下BAT、美团、vivo、爱奇艺等公司Offer面经总结
  14. 在微信小程序中怎么让一个页面的信息传递到另一个页面
  15. 经纬度与UTM(Universal Transverse Mercator Projector:通用横轴卡墨托投影)的坐标变换代码
  16. mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nonaggregated column.
  17. oracle.简单查询、排序、限定查询、单行函数
  18. 逆向某视频app(一)
  19. 解决uni-uploadFile上传图片丢失后缀名的问题
  20. 携手捷普 :让流程立于云端,臻于至善

热门文章

  1. 黄金 - 石油比率的历史:1970-2018
  2. BZOJ 1191: [HNOI2006]超级英雄Hero 二分图匹配
  3. 三拼域名拼音值得购买 短而精的三拼域名更适合中小企业
  4. 马来亚大学 计算机科学 排名,【马来亚大学计算机科学】 - 马来西亚留学联盟...
  5. 【每日一题】牛客--扑克牌大小
  6. 社招面经: 联易融Java开发一面2021.04.15
  7. 最新LYCMS影视PHP程序源码+支持自动采集
  8. 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include stdafx.h”?错误解决办法
  9. 交通事故2018数据_现实世界数据科学项目:交通事故分析
  10. 发生交通事故,仅造成轻微财产损失的,应当如何处置?