位置: 编程技术 - 正文

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

  • 从价从量复合计征
  • 建筑业的增值税税率是多少
  • 装修行业专票的税率是多少
  • 总账和成本哪个工资高
  • 从一个公司到另一个公司公积金
  • 房屋预售交款怎么交
  • 存货内部交易抵消通俗讲解
  • 打样费单位是什么
  • 债务重组损失计算公式
  • 建设工程服务招标管理办法
  • 工程预收账款的会计分录
  • 汇算清缴自查报告
  • 资产负债表和利润表在哪里查
  • 购买小汽车增值税发票金额开错
  • 企业所得税是当期收入吗
  • 免征增值税项目销售额含税吗
  • 免抵退税金额是啥意思
  • 资本化利息支出是什么意思
  • 企业一年零申报怎么办
  • 企业的污水处理设备可以间断性运行么
  • 键盘插上电脑却不能用
  • 房屋出租收入是多少
  • 小企业原材料包括
  • 小规模纳税人安装费税率
  • 电脑怎么设置色盲模式
  • 新办企业装修会计分录
  • 公司代缴社保公司吃亏吗
  • 认定科技型中小企业简单吗
  • PHP:apache_request_headers()的用法_Apache函数
  • php ftp管理系统
  • PHP:stream_register_wrapper()的用法_Stream函数
  • 分配股利什么时候做账
  • 应付职工薪酬的明细科目有哪些
  • 变动成本产品成本包括哪些
  • 税务安全证书不成功什么意思
  • IIS 7.5 asp Session超时时间设置方法
  • 艾罗芒阿
  • 搬迁补偿费属于什么费
  • php如何获取当前时间
  • php 收邮件
  • yolov3图像识别
  • vue组件强制刷新
  • vue3.0项目实战视频
  • node更新到最新版本
  • 前端axios请求怎么中断
  • 图像可以分成哪些类别?
  • bcdboot命令怎么用
  • 厂区租赁 法律规定
  • 平行结转的约当约当怎么计算
  • phpcms是什么框架
  • SQL SERVER 2008 64位系统无法导入ACCESS/EXCEL怎么办
  • 资产处置损益算营业外收入吗
  • 电缆租赁发票开具属于什么项目
  • 工程结算是否算成本
  • sqlserver阻止保存要求重新
  • mysql存储引擎的作用
  • 企业所得税债务重组一般性税务处理
  • 企业一次性伤残就业补助金是由保险赔付吗
  • 长期待摊费用科目怎么使用
  • 核销贷款收回账务怎么做
  • 单位食堂收费制度
  • 土地增值税怎么预交税款
  • 销售毛利率怎么算
  • 解决Windows Server远程断开后自动
  • linux里cat命令
  • 两台mac怎么同步
  • win10 win8.1双系统
  • windows自动启动设置
  • centos7.6安装kvm
  • newdot.exe - newdot是什么进程 有什么用
  • linux中查看文件
  • PasSrv.exe - PasSrv是什么进程 有什么用
  • win10自带绘画
  • 电脑因故障出现问题而启动
  • jquery form序列化
  • 安卓wifi打不开解决
  • javascript数组的本质
  • python添加用户并加入到相应组
  • 增值税一般纳税人和小规模纳税人的区别
  • 建筑公司材料发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设