位置: 编程技术 - 正文

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

  • 进口商品需要缴纳哪些税
  • 企业注销,账面余额怎样调账
  • 招待客人的住宿费能抵扣吗?
  • 个人银行帐户可查询多少年
  • 车辆商业险和强制险交完给退么
  • 成品油购进数据未同步怎么办
  • 取得增值税专用发票要算税吗
  • 小规模附加税减免政策2023最新
  • 附加税印花税个税申报实训心得
  • 检测样品留样期限
  • 关联企业如何取消
  • 应交税金属于什么会计分录
  • 员工无息借款个人所得税
  • 砂石建筑材料验收规范
  • 申报文化事业建设费
  • 营改增后企业缴税种类
  • 产品定价的含义
  • 卷烟批发环节消费税计算
  • 处理固定资产开什么发票
  • 1697509029
  • 企业所得税调增调减项目有哪些
  • 坏账准备为负数怎么填资产负债表
  • 玩穿越火线总是提示机器遇到
  • mac软件打开提示意外退出
  • 企业旅行社名字怎么取
  • 修改组策略后需要重启吗
  • windows设备超时是什么意思
  • 鸿蒙系统怎么安装电脑
  • 一般纳税人做账报税的整个流程详细
  • 如何认定坏账
  • thinkphp i方法
  • 贷款滞纳金如何收取
  • 退货的增值税专票怎么开
  • 企业在什么情况下会被列入经营异常
  • 滚动条基本样式有哪些
  • php 微信公众号自定义菜单
  • packet命令
  • 可供出售金融资产新准则叫什么
  • python smote算法
  • 汇兑损益的现金流量
  • 企业所得税的营业成本包括期间费用吗
  • 营改增后建筑企业财务核算
  • 金蝶凭证汇总表怎么打印
  • mysql操作步骤
  • c#调用excel
  • 低值易耗品如何界定
  • 小规模纳税人专用发票税率
  • 个人无需办理汇票业务
  • 广告费的税额计入哪里
  • 分公司是否具有独立承担民事责任的能力
  • 资产负债表日后期间是指
  • 预交税会计分录
  • 银行发放执行款多久到账
  • 计提福利费是什么意思
  • 所得税费用的核算方法叫
  • 土地使用权出资是什么意思
  • 怎么看懂自己的收入纳税
  • 小规模红冲发票收入正数税额负数
  • 开公司如何选择行业
  • 租房发票如何做分录
  • 服装销售怎么做
  • 会计结转是什么意思
  • 当你感觉到你的win2000运行速度明显减慢
  • virtualbox?
  • 微软出win9了吗
  • centos6.5mini安装教程
  • win7自带的多媒体播放程序是什么
  • win8 开机
  • 在windows xp
  • win7旗舰版用户
  • 原版windowsxp安装
  • centos怎么安装
  • nodejs操作sqlserver
  • android item属性
  • css网站布局实录 pdf
  • rpg游戏脚本已经被备份
  • 信息报送条例
  • 工会经费少申报一个月可以下个月补上吗
  • 长春市朝阳区公安局电话
  • 上海金山国税局局长
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设