位置: 编程技术 - 正文

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

  • 所得税费用为负数
  • 递延所得税资产和负债怎么理解
  • 累计折旧科目一直有余额吗
  • 总账一级科目有哪些
  • 市政绿化工程的施工方案
  • 独立核算的优点
  • 湖北省异地预缴增值税
  • 3项经费计提比例2015
  • 发票报销的条件是什么?
  • 增值税专票未认证丢失怎么办
  • 去年房租忘记摊销怎么办
  • 周转借款会计分录
  • 处置资产发生的清理费计入
  • 奖金计提发放会计分录
  • 当月未认证的发票可以作废
  • 六大减税措施内容
  • 分公司利润如何分红
  • 票据结算包括哪几项
  • 如何修改mac系统密码
  • 企业扶贫有什么优惠政策
  • 无法收回的应收票据怎么处理
  • 不要运行指定的Windows应用程序怎么设置win10教程
  • redis在php项目中的使用实例
  • 长期股权投资转让需要交什么税
  • 已认证未付款可以退款吗
  • PHP:Memcached::getByKey()的用法_Memcached类
  • 经济业务原始凭证分录
  • php抓取网页内容转换成json
  • fsck是什么文件
  • php和mysql的结合是目前web开发中的黄金组合
  • 盈余公积转增资本会计科目
  • PHP:gmstrftime()的用法_Date Time函数
  • 借款是经营性负债吗
  • 采购周转材料会计分录怎么写
  • php模板引擎执行时间
  • 建筑企业结转成本的依据是什么
  • 如何快速使用验证码
  • 小微企业所得税税收优惠政策2023年
  • centos8 telnet
  • 优先股可转让吗
  • 厂区道路不应该使用哪种材料
  • 退票产生的费用如何报销
  • 合伙企业的经营所得税率
  • 预提费用待摊费用改为什么科目
  • 债权转让收益需缴税吗
  • 应交税费中印花税是什么
  • 企业所得税免税项目
  • MicrosoftSQLserver2014可以卸载吗
  • PostgreSQL教程(九):事物隔离介绍
  • 期初余额调整怎么做凭证
  • 哪些员工出差的多
  • 流动资产属于经营资产还是得经营资产
  • 固定资产处置损益怎么算
  • 汽车销售和租赁业务描述
  • 报表的应付账款怎么算
  • 应付票据转应付账款分录
  • 开具的增值税专用发票上注明的价款含税吗
  • 律师咨询费计入什么科目
  • 融资租赁资产承租人的账务处理
  • 采购商品的运费会计分录
  • 购置固定资产支出怎么算
  • 应收账款和坏账准备的解题思路
  • 启用账簿时应在账簿上签名或盖章的是
  • SQL Server的通用分页存储过程 未使用游标,速度更快!
  • win10标题栏颜色改不了
  • macmini ubuntu
  • windows8whql
  • 安装win8正在安装应用要多久
  • 电脑中毒蓝屏了怎么办修复
  • cocos2d rpg
  • android 启动器 设置
  • jquery操作样式的方法
  • python科学计算程序
  • python模板引擎开发
  • js类的静态属性
  • 新疆电子税务局下载app
  • 广东电子税务局官网登录入口手机版
  • 税务总局纪律作风
  • 税控ic卡就是税控盘吗
  • 河北省原地税局领导班子
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设