Android开发之无bug滑动删除源码(非第三方库源码请在最后面自行下载)

1.我们先来看下效果图:上边是抽取出来的demo,下边是公司用到的项目

2.我们来看下如何调用(我们这里以listView为讲解,因为本公司现在项目用的就是listView)

package voicenotes.listviewdelete;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;import java.util.ArrayList;
import java.util.List;public class MainActivity extends Activity {private static final String TAG = "zxt";private ListView mLv;private List<SwipeBean> mDatas;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mLv = (ListView) findViewById(R.id.test);initDatas();mLv.setAdapter(new CommonAdapter<SwipeBean>(this, mDatas, R.layout.item_cst_swipe) {@Overridepublic void convert(final ViewHolder holder, SwipeBean swipeBean, final int position) {//((SwipeMenuLayout)holder.getConvertView()).setIos(false);//这句话关掉IOS阻塞式交互效果holder.setText(R.id.content, swipeBean.name);holder.setOnClickListener(R.id.content, new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "position:" + position, Toast.LENGTH_SHORT).show();}});holder.setOnClickListener(R.id.btnDelete, new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "删除了:" + mDatas.get(position).name, Toast.LENGTH_SHORT).show();//在ListView里,点击侧滑菜单上的选项时,如果想让擦花菜单同时关闭,调用这句话((SwipeMenuLayout) holder.getConvertView()).quickClose();mDatas.remove(position);notifyDataSetChanged();}});}});}private void initDatas() {mDatas = new ArrayList<>();for (int i = 0; i < 50; i++) {mDatas.add(new SwipeBean("招商银行 信用卡 (256" + i + ")"));}}
}

3.看下数据如何传递的

4.看下数据的格式如何设置的

public class SwipeBean {/*** 如果有其他的数据格式请自行在下面添加即可*/public String name;public SwipeBean(String name) {this.name = name;}
}

5.看下adapter:

package voicenotes.listviewdelete;
/** Copyright (c) 2018, smuyyh@gmail.com All Rights Reserved.* #                                                   #* #                       _oo0oo_                     #* #                      o8888888o                    #* #                      88" . "88                    #* #                      (| -_- |)                    #* #                      0\  =  /0                    #* #                    ___/`---'\___                  #* #                  .' \\|     |# '.                 #* #                 / \\|||  :  |||# \                #* #                / _||||| -:- |||||- \              #* #               |   | \\\  -  #/ |   |              #* #               | \_|  ''\---/''  |_/ |             #* #               \  .-\__  '-'  ___/-. /             #* #             ___'. .'  /--.--\  `. .'___           #* #          ."" '<  `.___\_<|>_/___.' >' "".         #* #         | | :  `- \`.;`\ _ /`;.`/ - ` : | |       #* #         \  \ `_.   \_ __\ /__ _/   .-` /  /       #* #     =====`-.____`.___ \_____/___.-`___.-'=====    #* #                       `=---='                     #* #     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   #* #                                                   #* #               佛祖保佑         永无BUG             #* #                                                   #*/import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;import java.util.ArrayList;
import java.util.List;/*** 创 建 者:下一页5(轻飞扬)* 创建时间:2018/6/27.12:52* 个人小站:http://wap.yhsh.ai(已挂)* 最新小站:http://www.iyhsh.icoc.in* 联系作者:企鹅 13343401268(请用手机QQ添加)* 博客地址:http://blog.csdn.net/xiayiye5* 空间名称:SwipeDelMenuLayout* 项目包名:voicenotes.listviewdelete*/
public abstract class CommonAdapter<T> extends BaseAdapter {protected Context mContext;protected List<T> mDatas;protected LayoutInflater mInflater;private int layoutId;public CommonAdapter(Context context, List<T> datas, int layoutId) {this.mContext = context;this.mInflater = LayoutInflater.from(context);this.mDatas = datas;this.layoutId = layoutId;}@Overridepublic int getCount() {return this.mDatas != null?this.mDatas.size():0;}@Overridepublic T getItem(int position) {return this.mDatas.get(position);}@Overridepublic long getItemId(int position) {return (long)position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = ViewHolder.get(this.mContext, convertView, parent, this.layoutId, position);this.convert(holder, this.getItem(position), position);return holder.getConvertView();}public abstract void convert(ViewHolder var1, T var2, int var3);public void setDatas(List<T> list) {if(this.mDatas != null) {if(null != list) {ArrayList temp = new ArrayList();temp.addAll(list);this.mDatas.clear();this.mDatas.addAll(temp);} else {this.mDatas.clear();}} else {this.mDatas = list;}this.notifyDataSetChanged();}public void remove(int i) {if(null != this.mDatas && this.mDatas.size() > i && i > -1) {this.mDatas.remove(i);this.notifyDataSetChanged();}}public void addDatas(List<T> list) {if(null != list) {ArrayList temp = new ArrayList();temp.addAll(list);if(this.mDatas != null) {this.mDatas.addAll(temp);} else {this.mDatas = temp;}this.notifyDataSetChanged();}}public List<T> getDatas() {return this.mDatas;}
}

6.我们来看下自己写的ViewHolder

/*** 创 建 者:下一页5(轻飞扬)* 创建时间:2018/6/27.12:53* 个人小站:http://wap.yhsh.ai(已挂)* 最新小站:http://www.iyhsh.icoc.in* 联系作者:企鹅 13343401268(请用手机QQ添加)* 博客地址:http://blog.csdn.net/xiayiye5* 空间名称:SwipeDelMenuLayout* 项目包名:voicenotes.listviewdelete*/
public class ViewHolder {private SparseArray<View> mViews;private int mPosition;private View mConvertView;private Context mContext;private int mLayoutId;public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) {this.mContext = context;this.mLayoutId = layoutId;this.mPosition = position;this.mViews = new SparseArray();this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);this.mConvertView.setTag(this);}public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) {if(convertView == null) {return new ViewHolder(context, parent, layoutId, position);} else {ViewHolder holder = (ViewHolder)convertView.getTag();holder.mPosition = position;return holder;}}public int getPosition() {return this.mPosition;}public int getLayoutId() {return this.mLayoutId;}public <T extends View> T getView(int viewId) {View view = (View)this.mViews.get(viewId);if(view == null) {view = this.mConvertView.findViewById(viewId);this.mViews.put(viewId, view);}return (T) view;}public View getConvertView() {return this.mConvertView;}public ViewHolder setSelected(int viewId, boolean flag) {View v = this.getView(viewId);v.setSelected(flag);return this;}public ViewHolder setText(int viewId, String text) {TextView tv = (TextView)this.getView(viewId);tv.setText(text);return this;}public ViewHolder setImageResource(int viewId, int resId) {ImageView view = (ImageView)this.getView(viewId);view.setImageResource(resId);return this;}public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) {ImageView view = (ImageView)this.getView(viewId);view.setImageBitmap(bitmap);return this;}public ViewHolder setImageDrawable(int viewId, Drawable drawable) {ImageView view = (ImageView)this.getView(viewId);view.setImageDrawable(drawable);return this;}public ViewHolder setBackgroundColor(int viewId, int color) {View view = this.getView(viewId);view.setBackgroundColor(color);return this;}public ViewHolder setBackgroundRes(int viewId, int backgroundRes) {View view = this.getView(viewId);view.setBackgroundResource(backgroundRes);return this;}public ViewHolder setTextColor(int viewId, int textColor) {TextView view = (TextView)this.getView(viewId);view.setTextColor(textColor);return this;}public ViewHolder setTextColorRes(int viewId, int textColorRes) {TextView view = (TextView)this.getView(viewId);view.setTextColor(this.mContext.getResources().getColor(textColorRes));return this;}@SuppressLint({"NewApi"})public ViewHolder setAlpha(int viewId, float value) {if(Build.VERSION.SDK_INT >= 11) {this.getView(viewId).setAlpha(value);} else {AlphaAnimation alpha = new AlphaAnimation(value, value);alpha.setDuration(0L);alpha.setFillAfter(true);this.getView(viewId).startAnimation(alpha);}return this;}public ViewHolder setVisible(int viewId, boolean visible) {View view = this.getView(viewId);view.setVisibility(visible?0:8);return this;}public ViewHolder linkify(int viewId) {TextView view = (TextView)this.getView(viewId);Linkify.addLinks(view, 15);return this;}public ViewHolder setTypeface(Typeface typeface, int... viewIds) {int[] var3 = viewIds;int var4 = viewIds.length;for(int var5 = 0; var5 < var4; ++var5) {int viewId = var3[var5];TextView view = (TextView)this.getView(viewId);view.setTypeface(typeface);view.setPaintFlags(view.getPaintFlags() | 128);}return this;}public ViewHolder setProgress(int viewId, int progress) {ProgressBar view = (ProgressBar)this.getView(viewId);view.setProgress(progress);return this;}public ViewHolder setProgress(int viewId, int progress, int max) {ProgressBar view = (ProgressBar)this.getView(viewId);view.setMax(max);view.setProgress(progress);return this;}public ViewHolder setMax(int viewId, int max) {ProgressBar view = (ProgressBar)this.getView(viewId);view.setMax(max);return this;}public ViewHolder setRating(int viewId, float rating) {RatingBar view = (RatingBar)this.getView(viewId);view.setRating(rating);return this;}public ViewHolder setRating(int viewId, float rating, int max) {RatingBar view = (RatingBar)this.getView(viewId);view.setMax(max);view.setRating(rating);return this;}public ViewHolder setTag(int viewId, Object tag) {View view = this.getView(viewId);view.setTag(tag);return this;}public ViewHolder setTag(int viewId, int key, Object tag) {View view = this.getView(viewId);view.setTag(key, tag);return this;}public ViewHolder setChecked(int viewId, boolean checked) {Checkable view = (Checkable)this.getView(viewId);view.setChecked(checked);return this;}public ViewHolder setOnClickListener(int viewId, View.OnClickListener listener) {View view = this.getView(viewId);view.setOnClickListener(listener);return this;}public ViewHolder setOnTouchListener(int viewId, View.OnTouchListener listener) {View view = this.getView(viewId);view.setOnTouchListener(listener);return this;}public ViewHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {View view = this.getView(viewId);view.setOnLongClickListener(listener);return this;}
}

7.下面是对应的布局xml文件

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/test"android:layout_width="match_parent"android:layout_height="match_parent"/>
</RelativeLayout>

item_cst_swipe.xml

<?xml version="1.0" encoding="utf-8"?>
<voicenotes.listviewdelete.SwipeMenuLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="44dp"android:background="@android:color/white"android:clickable="true"android:minHeight="44dp"android:paddingBottom="1dp"android:paddingLeft="16dp"app:ios="false"app:leftSwipe="true"app:swipeEnable="true"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"><ImageViewandroid:id="@+id/iv_bindCard_list_item"android:layout_width="20dp"android:layout_height="20dp"android:layout_marginLeft="10dp"android:src="@drawable/yhsh_bank_zs" /><TextViewandroid:id="@+id/content"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginLeft="8dp"android:layout_weight="1"android:text="@string/yhsh_bank_type"android:textColor="@color/describe_text"android:textSize="16sp" /></LinearLayout><!-- 以下都是侧滑菜单的内容依序排列 --><Buttonandroid:id="@+id/btnTop"android:layout_width="60dp"android:layout_height="match_parent"android:background="#d9dee4"android:text="置顶"android:textColor="@android:color/white" /><Buttonandroid:id="@+id/btnUnRead"android:layout_width="120dp"android:layout_height="match_parent"android:background="#ecd50a"android:clickable="true"android:text="标记未读"android:textColor="@android:color/white" /><Buttonandroid:id="@+id/btnDelete"android:layout_width="60dp"android:layout_height="match_parent"android:background="@color/red_ff4a57"android:text="删除"android:textColor="@android:color/white" /><!--    <RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:background="@color/red_ff4a57"android:clickable="true"><TextViewandroid:id="@+id/tv_delete"android:layout_width="100dp"android:layout_height="wrap_content"android:layout_centerVertical="true"android:drawablePadding="5dp"android:drawableTop="@drawable/point_icon_delete"android:gravity="center"android:text="删除"android:textColor="@android:color/white"/></RelativeLayout>--></voicenotes.listviewdelete.SwipeMenuLayout>

源码下载

GitHub源码库

Android开发之无bug滑动删除源码(非第三方库)相关推荐

  1. Android开发之WebView加载HTML源码包含转义字符实现富文本显示的方法

    老套路先看效果图: WebView加载带有转移字符的HTML源码 再看转义后的字符的效果图: 先看WebView加载HTML源码的方法如下: webview.loadDataWithBaseURL(n ...

  2. Android开发之GPS测试完整案例源码详解之实时检测GPS的状态

    获取Android系统Location位置服务实例: /*** Get location manager system service** @return LocationManager*/publi ...

  3. Android开发之google Zxing实现二维码扫描的代码分析

    1.技术简介    在Android中实现二维码的扫描主要是通过第三方框架来实现的,主要框架是google的Zxing.现在就用该框架来实现二维码及条形码的扫描及识别,同时对于手机中存储的图片也进行识 ...

  4. android scrollview 滚动监听,Android开发之ScrollView的滑动监听

    我们需要监听ScroView的滑动情况,比如滑动了多少距离,是否滑到布局的顶部或者底部.可惜的是SDK并没有相应的方法,不过倒是提供了一个 protected void onScrollChanged ...

  5. Vue - 实现图片裁剪功能,并上传到服务器(内置第三方最优秀的裁剪图片组件,上传到服务器功能)干净整洁无 BUG 的示例源码与超详细的注释,兼容任意浏览器

    前言 您可以滑动到文章最底部,直接克隆完整示例 Gitee 仓库,与本文教程最终效果一致. 在项目开发中,您难免会遇到图片上传到服务器之前,用户可进行裁剪的需求, 在看了网上大部分教程后,代码都非常乱 ...

  6. Syncthing源码解析 - 第三方库

    1,AudriusButkevicius/cli 网址:https://github.com/AudriusButkevicius/cli 2,bkaradzic/go-lz4 网址:https:// ...

  7. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

    今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可以 ...

  8. Android透明到白色滑动渐变,Android开发之Activity全透明渐变切换方法

    Activity全透明渐变切换 类似于Dialog的显示动画效果一样 1. 先设置Acitivity为去透明,在取消掉Activity默认的切换动画 true @color/colorPrimary ...

  9. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

最新文章

  1. Windows原生运行Linux的技术细节
  2. mysql报错1690_Mysql运行模式及1690错误处理
  3. vlfeat 特征检测
  4. PMP-【第8章 项目质量管理】-2021-2-12(180页-199页)
  5. opencv 图像 抠图 算法_我讨厌这个绿油油的头像!我用opencv换一下背景
  6. 实现接口java_Java – 实现接口
  7. 【JX4G】JX4G摄影测量工作站快捷键大全
  8. 拼装机器人感想_机器人心得体会(20190510062147)
  9. Rust 算法排位记-选择排序图示与代码实现
  10. (转)em重建全过程
  11. 饭卡 01背包 DP
  12. easyUI中datagrid中getSelected和getSelections的用法
  13. List对象集合通过对象属性进行查找
  14. [转]Microsoft SQL Server Management Studio Express 使用SQL验证登录sa
  15. C++Builder 2010深入TApplication类之方法
  16. ansible源码解读
  17. Centos7安装Informix
  18. android 4.4.2截屏方法,Android截屏截图的几种方法总结
  19. win任务栏计算机变未知,深度技术Win7电脑任务栏图标显示异常的解决方法
  20. C++(类与对象)是纸老虎吗?

热门文章

  1. mysql 权限命令 revoke_mysql 权限管理使用 grant/revoke
  2. mysql php 缓存机制_mysql数据库查询缓存原理是什么
  3. 考计算机专业西南大学排名,2017西南大学优势专业排名
  4. linux python2.7 链接mysql导出数据库脚本_python备份文件以及mysql数据库的脚本代码...
  5. python怎么输出一个数组_python中实现将多个print输出合成一个数组
  6. linux100day(day7)--用户管理和权限管理简单介绍
  7. 阅读王概凯老师架构漫谈系列总结
  8. 第2天:Ansible-Inventory管理
  9. CPU,MPU,MCU,SOC,SOPC联系与差别
  10. centos 安装 acrobat Reader之后