位置: 编程技术 - 正文

ListView滑动删除 ,仿腾讯QQ(怎么删除listview条目)

编辑:rootadmin

推荐整理分享ListView滑动删除 ,仿腾讯QQ(怎么删除listview条目),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:listview长按删除item,listview不能滑动,listview不能滑动,listview怎么删除所选的那一列,listview左滑删除,listview左滑删除,listview怎么删除所选的那一列,listview左滑删除,内容如对您有帮助,希望把文章链接给更多的朋友!

转载请表明出处: view plaincopy<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <Button android:id="@&#;id/id_item_btn" android:layout_width="dp" android:singleLine="true" android:layout_height="wrap_content" android:text="删除" android:background="@drawable/d_delete_btn" android:textColor="#ffffff" android:paddingLeft="dp" android:paddingRight="dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="dp" /> </LinearLayout> 主布局文件:activity_main.xml,ListView的每个Item的样式直接使用了系统的android.R.layout.simple_list_item_1

[html] view plaincopy<RelativeLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.listviewitemslidedeletebtnshow.QQListView android:id="@&#;id/id_listview" android:layout_width="fill_parent" android:layout_height="wrap_content" > </com.example.listviewitemslidedeletebtnshow.QQListView> </RelativeLayout> 接下来看看QQListView的实现:ListView滑动删除 ,仿腾讯QQ(怎么删除listview条目)

[java] view plaincopypackage 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 = ; // 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(); } @Override public 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); // 获得当前手指按下时的item View 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); } @Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); /** * 如果是从右到左的滑动才相应 */ if (isSliding) { switch (action) { case MotionEvent.ACTION_MOVE: int[] location = new int[2]; // 获得当前item的位置x与y mCurrentView.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() { @Override public 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,这里代码很简单不做介绍了。

[java] view plaincopypackage 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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = (QQListView) findViewById(R.id.id_listview); // 不要直接Arrays.asList mDatas = 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() { @Override public void clickHappend(final int position) { Toast.makeText(MainActivity.this, position &#; " : " &#; mAdapter.getItem(position), 1).show(); mAdapter.remove(mAdapter.getItem(position)); } }); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public 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。

类型为 GestureTest 的方法 onDown(MotionEvent)必须覆盖或实现超类型方法 出现类错误的原因可能为导入外部类时导入错误的包中的类,因为有的类在好几个包中有,比如说题目中的OnGestureListener这个借口,在GestureOverlayView中有

Android启动过程及FrameWork初始化 Android启动时,首先通过Bootloader加载Linux内核,然后调用init进程对各种设备进行初始化,运行FrameWork所需的各种Deamon,ContextManager,MediaServer,Zygote等。1、Cont

Android NDK编程浅入深出之--Android.mk Android.mkAndroid.mk是一个向AndroidNDK构建系统描述NDK项目的GUNMakefile片段。它是每一个NDK项目的必备组件。构建系统希望它出现在jni子目录中。下面是hello-jni

标签: 怎么删除listview条目

本文链接地址:https://www.jiuchutong.com/biancheng/368583.html 转载请保留说明!

上一篇:《深入理解Android网络编程》第3章(深入理解rcu)

下一篇:类型为 GestureTest 的方法 onDown(MotionEvent)必须覆盖或实现超类型方法(酵母菌代谢类型为)

  • 税控系统怎么登录
  • 向银行借款产生的利息
  • 支票上的法人章和财务章是央行盖吗
  • 收到工程服务费会计分录
  • 银行存款日记账电子表格模板
  • 定额征收需要建账吗
  • 毛利和销售毛利
  • 纳税申报方式如何更改
  • 支付外汇货款
  • 增值税采用零税率政策的内容
  • 留抵税额抵减欠税文件
  • 收到采购商品
  • 企业微信支付密码怎么设置
  • 出售旧机床的账务处理
  • 企业所得税季报营业收入,营业成本怎么填
  • 增值税申报税额填错了怎么进行填
  • 一般纳税人贸易公司每个月最低费用多少
  • 合伙企业个人所得税经营所得税率
  • 房产税缴纳时间规定
  • 企业ci
  • 所得税年报调增调减
  • 发票入账后还能冲红吗
  • 应收账款周转率怎么分析
  • 增值税及附加税是什么意思
  • 材料按计划成本计价下,外购材料结算
  • 教你如何正确选择轮胎
  • 往来款能转为投资款的说明
  • php设计模式及使用场景
  • 年终奖发放问题
  • 材料委托加工
  • vite配置详解
  • php使用什么开发工具
  • 企业管理的管理系统
  • 企业无偿借款的税务处理
  • 支付的招标代理费计入成本还是费用
  • 企业所得税申报表在哪里打印
  • 数据库impala
  • siri怎么重置主人声音ios13
  • javascript对象有哪些
  • web安全什么意思
  • html/css/javascript标准教程
  • 增值税专用发票的税率是多少啊
  • 以前年度损益调整借贷方向
  • 物流公司增值税发票
  • 微擎框架下载
  • php swoole 协程
  • 现金收款凭证是发票吗
  • 试生产期间发生事故后重新
  • 上一年度的费用能入今年账吗
  • 印花税可以年底报一次
  • 营改增后为什么利息要提供发票吗
  • 基本工资是包括哪些内容
  • 提交表单数据有哪几种方法,php如何获取表单提交的数据
  • 汽车买卖中介
  • 换货与退货
  • 去年多计提的所得税怎么处理
  • 上年度多提财务费用
  • 风险纳税人去税务局去报税可以吗
  • 给客户买的礼品要交税吗
  • 微信支付的账务在哪里
  • 隔月红票怎么开
  • 坏账收不回来如何做分录
  • 金蝶旗舰版的数据怎么在标准版打开
  • 年平均资金占用额公式
  • 餐饮行业招聘方案
  • mysql中索引的使用
  • sql存储过程实例有哪些
  • 查看mysql执行计划关键字
  • xp系统经常未响应怎么办
  • win10企业版教育版专业版哪个好
  • win10预览版和正式版
  • 在linux中使用什么命令可以执行shell脚本
  • 系统自带邮件
  • cocos2dx node
  • nodejs实战
  • android开发app
  • 电子发票版式文件生成失败怎么办
  • 如何办理股权转让信息登记表
  • 树叶加树叶等于几
  • 核定征收一般纳税人
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设