位置: 编程技术 - 正文

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)必须覆盖或实现超类型方法(酵母菌代谢类型为)

  • 增值税专用发票有效期是多长时间
  • 收据收到写什么
  • 小规模纳税人外账处理
  • 金税盘怎样查询已开发票明细
  • 发票预付款充值卡是否报销
  • 公司在筹备阶段可以不交社保
  • 居民企业股权转让所得
  • 集资款利息走什么科目
  • 可以向国外账户汇人民币吗
  • 票据利息科目怎么设置
  • 交易性金融资产的入账价值
  • 承兑多付了退现金网银备注什么
  • 向其他单位无偿提供服务的不需缴纳增值税
  • 增值税普通发票查询真伪
  • 代扣代缴税种有几个
  • 金税四期进展
  • bios设置技巧
  • win10更新补丁怎么关闭
  • Win11安装如何跳过以太网
  • 会计监督的基本规定有哪些
  • 申报补贴项目 审计
  • 怎么看iPhone电池温度
  • 缴纳公积金个人没有扣款怎么回事
  • igfxext.exe
  • mstore.exe - mstore是什么进程 有什么用
  • 公司已开工程发票怎么开
  • 文竹浇白糖水的正确方法
  • 有形动产融资租赁增值税即征即退政策
  • 产供销一体化什么意思
  • 软件工程毕设题目冷门
  • 兰溪园林绿化养护
  • php使用什么开发工具
  • html该怎么学
  • php注册和登录界面
  • framework教程
  • 建筑修缮服务税率
  • 公司给职工买工伤险流程
  • 模型调参是调节什么
  • 应收账款的
  • 所得税在什么情况下免税
  • 公账钱怎么取出
  • mongodb数据库中间创建自己名字首字母的数据库
  • 终止经营列报的相关表述
  • 未使用的固定资产
  • 企业所得税申报错误怎么更改
  • Debian中PostgreSQL数据库安装配置实例
  • 无形资产摊销会计凭证
  • 小规模纳税人可以开13的税吗
  • 来料加工账务处理流程
  • 其他业务收入如何核算
  • 坏账准备的账务处理会计分录
  • 写字楼里的公司怎么赚钱
  • 去税务局核定税种多久生效
  • 工程施工发生的酒水费会计分录
  • 企业出现有利润的现象
  • 摊余成本通俗
  • 按不同要求分类
  • windows7创建虚拟桌面
  • windowsandbox
  • window组策略
  • 本地磁盘未响应怎么解决
  • 1.cpp执行的是什么文件
  • 如何解决windows无法访问指定设备
  • winxp截图快捷命令
  • 升级win102004
  • opengl 实现
  • nodejs做接口
  • docker 开源项目
  • suse linux 网络配置
  • python文件管理系统难点总结
  • js遍历获取指定数据
  • nodejs实现文件下载
  • bootstrap学习
  • Android StateMachine解析( 1 )
  • 湖南增值税普通发票查询系统官网
  • 公司信用等级b级是什么意思
  • 京东商城发票查询
  • 小规模纳税人应交增值税账务处理
  • 建设工程造价咨询合同需要交印花税吗
  • 城镇土地使用税暂行条例
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设