参考了以下源码:https://github.com/baoyongzhang/SwipeMenuListView

实现的效果(顺便推荐一个视频转gif的网址:http://www.gif5.net/)

首先抛出几个问题:

1.如何根据我们的手势判定要左滑的position

2.滑动到什么程度让左滑的Menu显示出来

3.怎么处理item左滑与ListView的滑动的冲突

4.menu怎么添加

5.只能有一个是Open的状态,如果Item1是Open,这时候点击或者滑动Item2,应该使Item1关闭(拦截触摸事件,稍候详细添加)

首先,定义一个CustomSlideDeleteItemView,这个View的layout要重写,确定menu的摆放位置,具体见代码

package com.example.myapp.view;import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;import com.example.myapp.R;
import com.example.myapp.util.Methods;import java.util.ArrayList;
import java.util.List;/*** Created by zyr* DATE: 16-3-19* Time: 下午3:54* Email: yanru.zhang@renren-inc.com*/
public class CustomSlideDeleteItemView extends FrameLayout{private Context mContext;private List<View> menuViews = new ArrayList<>();private View contentView;private LinearLayout menuViewContainer;private int contentViewId;private int contentViewWidth,contentViewHeight,menuWidth,menuHeight;public boolean isMenuOpen() {return isMenuOpen;}private boolean isMenuOpen = false;public void setOnMenuClickListener(OnMenuClickListener onMenuClickListener) {this.onMenuClickListener = onMenuClickListener;}private OnMenuClickListener onMenuClickListener;public interface OnMenuClickListener{void onMenuClick(int i,int counts);}public CustomSlideDeleteItemView(Context context) {this(context, null);}public CustomSlideDeleteItemView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public CustomSlideDeleteItemView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mContext = context;menuWidth = Methods.computePixelsWithDensity(mContext,100);Log.d("zyr","menuWidth:" + menuWidth);TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomSlideDeleteItemView);for(int i=0;i<typedArray.length();i++){int attr = typedArray.getIndex(i);switch (attr){case R.styleable.CustomSlideDeleteItemView_contentViewId:contentViewId = typedArray.getResourceId(R.styleable.CustomSlideDeleteItemView_contentViewId,0);break;}}if(contentViewId!=0){contentView = findViewById(contentViewId);}menuViewContainer = new LinearLayout(mContext);menuViewContainer.setOrientation(LinearLayout.HORIZONTAL);ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);addView(menuViewContainer, layoutParams);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);if(contentView!=null){contentView.layout(0, 0, getMeasuredWidth(), getMeasuredHeight());}layoutMenu();}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);if(w!=oldw || h!=oldh){contentViewHeight = menuHeight = h;contentViewWidth = w;
//            Log.d("zyr","contentViewWidth:" + contentViewWidth);
        }}public void addMenu(String s,int color){TextView textView = new TextView(mContext);textView.setText(s);textView.setBackgroundColor(color);textView.setTextColor(getResources().getColor(R.color.white));textView.setGravity(Gravity.CENTER);LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(menuWidth, ViewGroup.LayoutParams.MATCH_PARENT);menuViews.add(textView);menuViewContainer.addView(textView, layoutParams);invalidate();for(int i=0;i<menuViews.size();i++){final int position = i;View view = menuViews.get(i);view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(onMenuClickListener!=null){onMenuClickListener.onMenuClick(position,menuViews.size());scrollBack();}}});}}public void clearAllMenu(){menuViews.clear();menuViewContainer.removeAllViews();invalidate();}private void layoutMenu() {menuViewContainer.layout(contentViewWidth, 0, contentViewWidth + menuWidth * menuViews.size(), contentViewHeight);}public void scroll(int deltaX,int lastDeltaX) {if(deltaX < 0){Log.d("zyr","deltaX:" + deltaX);Log.e("zyr","menuWidth * menuViews.size():" + menuWidth * menuViews.size());if(Math.abs(deltaX) > menuWidth * menuViews.size() ){scrollTo(menuWidth * menuViews.size(), 0);isMenuOpen = true;}else{scrollBy(-lastDeltaX, 0);}}else{if(isMenuOpen()){Log.d("zyr","deltaX:" + deltaX);Log.e("zyr", "menuWidth * menuViews.size():" + menuWidth * menuViews.size());if(Math.abs(deltaX) > menuWidth * menuViews.size()){scrollTo(0,0);isMenuOpen = false;}else{scrollBy(-lastDeltaX, 0);}}}}public void autoScroll(int deltaX){if(deltaX < 0){if(Math.abs(deltaX) < menuWidth){scrollTo(0, 0);isMenuOpen = false;}else{scrollTo(menuWidth * menuViews.size(), 0);isMenuOpen = true;}}else{if(isMenuOpen()){if(Math.abs(deltaX) < menuWidth){scrollTo(menuWidth * menuViews.size(), 0);isMenuOpen = true;}else{scrollTo(0,0);isMenuOpen = false;}}}}public void scrollBack(){scrollTo(0,0);isMenuOpen = false;}
}

在attr文件中定义

<declare-styleable name="CustomSlideDeleteItemView"><attr name="contentViewId" format="integer"/></declare-styleable>

然后定义我们的CustomSlideDeleteListView

package com.example.myapp.view;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView;import com.example.myapp.R;/*** Created by zyr* DATE: 16-3-18* Time: 下午5:42* Email: yanru.zhang@renren-inc.com*/
public class CustomSlideDeleteListView extends ListView {private Context mContext;private CustomSlideDeleteItemView mCurrentView;private int currentItemId;private int downX,downY,moveX,moveY,deltaX,deltaY,upX,upY,lastX,lastDeltaX;public final static int MIN_SCROLL_DIS = 100;public CustomSlideDeleteListView(Context context) {this(context, null);}public CustomSlideDeleteListView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public CustomSlideDeleteListView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mContext = context;setSelector(new ColorDrawable(Color.TRANSPARENT));TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomSlideDeleteListView);for(int i=0;i<typedArray.length();i++){int attr = typedArray.getIndex(i);switch (attr){case R.styleable.CustomSlideDeleteListView_rightViewId:break;}}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()){case MotionEvent.ACTION_DOWN:lastX = downX = (int) ev.getX();downY = (int) ev.getY();currentItemId = pointToPosition(downX, downY);mCurrentView = (CustomSlideDeleteItemView)getChildAt(currentItemId - getFirstVisiblePosition());
//                Log.e("zyr","currentItemId:" + currentItemId);break;case MotionEvent.ACTION_MOVE:/**还要区分上下滑动listview的时候**/moveX = (int) ev.getX();moveY = (int) ev.getY();deltaX = moveX - downX;deltaY = moveY - downY;if(Math.abs(deltaX) > Math.abs(deltaY)){lastDeltaX = moveX - lastX;lastX = moveX;
//                Log.d("zyr","deltaX:" + deltaX);
//                Log.e("zyr","canShowRightView " + canShowRightView);if(Math.abs(deltaX) > MIN_SCROLL_DIS && mCurrentView!=null){mCurrentView.scroll(deltaX,lastDeltaX);return true;}}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:upX = (int)ev.getX();upY = (int)ev.getY();if(mCurrentView!=null && Math.abs(upX-downX) > MIN_SCROLL_DIS){mCurrentView.autoScroll(upX-downX);}break;}return super.onTouchEvent(ev);}
}

最后需要定义我们的Adapter

package com.example.myapp.adapter;import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import android.widget.Toast;import com.example.myapp.R;
import com.example.myapp.view.CustomSlideDeleteItemView;import java.util.ArrayList;
import java.util.List;/*** Created by zyr* DATE: 15-11-26* Time: 下午2:52* Email: yanru.zhang@renren-inc.com*/
public class CustomSlideDeleteListViewAdapter extends BaseAdapter implements Filterable{public List<String> arrayList = new ArrayList<String>();private Context context;private MyFilter mFilter;public CustomSlideDeleteListViewAdapter(Context context){this.context = context;}public CustomSlideDeleteListViewAdapter(Context context, List<String> arrayList){this.context = context;this.arrayList = new ArrayList<String>(arrayList);}public void setData(List<String> array){if(array ==null){return;}arrayList = new ArrayList<String>(array);notifyDataSetChanged();}@Overridepublic int getCount() {return arrayList.size();}@Overridepublic Object getItem(int position) {return arrayList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if(convertView ==null){convertView = LayoutInflater.from(context).inflate(R.layout.list_view_item,null);viewHolder = new ViewHolder(convertView);convertView.setTag(viewHolder);}else{viewHolder = (ViewHolder)convertView.getTag();}viewHolder.itemView.clearAllMenu();viewHolder.itemView.addMenu("Delete", Color.RED);viewHolder.itemView.addMenu("Open", Color.BLUE);viewHolder.itemView.scrollBack();viewHolder.textView.setText(arrayList.get(position));viewHolder.itemView.setOnMenuClickListener(new CustomSlideDeleteItemView.OnMenuClickListener() {@Overridepublic void onMenuClick(int i, int counts) {switch (i){case 0:arrayList.remove(position);notifyDataSetChanged();break;case 1:break;}}});return convertView;}@Overridepublic Filter getFilter() {if (mFilter == null) {mFilter = new MyFilter();}return mFilter;}class MyFilter extends Filter {@Overrideprotected FilterResults performFiltering(CharSequence constraint) {FilterResults results = new FilterResults();if (arrayList == null) {arrayList = new ArrayList<String>();}results.values = arrayList;results.count = arrayList.size();return results;}@Overrideprotected void publishResults(CharSequence constraint, FilterResults results) {if (results.count > 0) {notifyDataSetChanged();} else {notifyDataSetInvalidated();}}}class ViewHolder{CustomSlideDeleteItemView itemView;TextView textView;public ViewHolder(View view){itemView = (CustomSlideDeleteItemView)view;textView = (TextView)view.findViewById(R.id.list_view_text);}}
}

adapter引用的xml文件

<?xml version="1.0" encoding="utf-8"?>
<com.example.myapp.view.CustomSlideDeleteItemView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"xmlns:app="http://schemas.android.com/apk/res-auto"android:background="@drawable/common_listview_bg"app:contentViewId="@+id/list_view_text"><TextView android:id="@+id/list_view_text"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:textColor="@color/primary"android:textStyle="bold"android:paddingLeft="20dp" />
</com.example.myapp.view.CustomSlideDeleteItemView>

在Activity中引用

  customSlideDeleteListView = (CustomSlideDeleteListView) findViewById(R.id.custom_slid_delete_list_view);for(int i=0;i<100;i++){stringList.add("zyr" + i);}customSlideDeleteListViewAdapter = new CustomSlideDeleteListViewAdapter(this,stringList);customSlideDeleteListView.setAdapter(customSlideDeleteListViewAdapter);

转载于:https://www.cnblogs.com/bbglz/p/5305873.html

自己实现一个右滑删除的ListView相关推荐

  1. AS2:实现右滑删除,点击展开及点击跳转

    目录 一.右滑删除 1.设计界面 2.适应器adapter 3.在对应的fragment中设置 4.效果展示 二.点击展开 1.设计界面 2.建立适应器 3.在对应的Activity的Frament中 ...

  2. 利用swipelistview完成qq聊天列表右滑删除功能

    感谢HarryWeasley整理:http://blog.csdn.net/harryweasley/article/details/41413547 前言:前段时间,由于自己比较悠闲,没有什么工作上 ...

  3. 微信改成右滑删除_微信大更新!微信支持无损发送大文件;新增“裂开”等黄脸表情|一周资讯...

    微信生态 NO.1 微信支持无损发送大文件 今日,微信支持发送高清视频和图片,且不会被压缩.微信用户点击对话框右下角的 + 号,右滑点击"文件",在上方选择手机相册,就能选择想要发 ...

  4. 微信改成右滑删除_手机文件数据恢复,怎样恢复已过期的微信附件呢?

    手机文件数据恢复,怎样恢复已过期的微信附件呢?我们在恢复手机删除的文件之前,很多人都想知道,为什么自己的文件删除了可以被恢复,既然能被恢复,是我彻底删除不了手机的文件吗? 文件真的消失了吗? 事实上真 ...

  5. android微信右滑删除,Android实现微信侧滑删除当前页面

    本文实例为大家分享了微信侧滑删除当前页面的具体代码,供大家参考,具体内容如下 效果图不是太明显 实际上有finish动画 代码 package com.finddreams.slidingback.u ...

  6. 微信小程序之触摸滑动事件案例+Slideview组件【手动左滑删除效果】

    前言: 现在很多程序上都有左滑删除的效果,其实实现很简单,今天我们主要来记录一下小程序的左滑删除的实现过程. 效果图: 实现效果: 当我们在该条记录上进行左滑操作时,整条记录跟着向左移动,同时右侧的删 ...

  7. Android自定义组合控件---教你如何自定义下拉刷新和左滑删除

    绪论 最近项目里面用到了下拉刷新和左滑删除,网上找了找并没有可以用的,有比较好的左滑删除,但是并没有和下拉刷新上拉加载结合到一起,要不就是一些比较水的结合,并不能在项目里面使用,小编一着急自己组合了一 ...

  8. html仿微信滑动删除,使用Vue实现移动端左滑删除效果附源码

    左滑删除在移动端是很常见的一种操作,常见于删除购物车中的商品,删除收藏夹中文章等等场景.我们只需要手指按住要删除的对象,然后轻轻向左滑动,便会出现删除按钮,然后点击删除按钮即可删除对象. 点击下载源码 ...

  9. 微信小程序实现列表项左滑删除效果

    效果 图片 WXML <view class="container"><!-- 收货地址 --><view class="address&q ...

最新文章

  1. cron 定时器简单入门
  2. 快速下载 | TBtools 软件最新版本与相关数据库文件
  3. 福利 | 学习超级用户运营,都来U-Time六城巡回沙龙”!
  4. 2019年最新深度强化学习PPT(DeepMind制作)
  5. hdu4515 小模拟
  6. asp.net 中ListBox 显示 2 列
  7. 中国到底有多少个.NET 程序员?都在哪个城市写代码?
  8. pc 图片预览放大 端vue_安利一款简单好用的Vue图片预览插件
  9. 为什么jdk的CLASSPATH环境变量需要设置rt.jar 和 tools.jar
  10. 工作172:自己工作开始封装的一个小组件
  11. ListBox之随手放个控件
  12. Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
  13. 阿里巴巴 EasyExcel (web版) 上传与下载(超详细) Excel上传下载
  14. python黑帽子编程实现没网流量抓包和统计_《Python黑帽子》python3代码实现(第三章)...
  15. sql数据库置疑解决办法
  16. Sublime常用快捷键
  17. php 取余数函数,PHP取余函数介绍MOD(x,y)与x%y
  18. api 与 implement 的区别
  19. pycharm 中 ‘unicodeescape’ codec can’t decode bytes in position XXX: trun错误解决方案背景描述...
  20. 机器人香囊_中山街道仪凤街社区开展“能手包粽子 巧手绣香包”欢度端午节活动...

热门文章

  1. Interface接口
  2. 字符串 不是有效的 AllXsd 值。
  3. [导入]存储过程-分隔符号-多条件查询
  4. wireshark协议插件开发--官方文档中文翻译
  5. JDK1.7 深入理解 LinkedHashMap
  6. (42)FPGA四种常用逻辑门(同或门)
  7. (47)FPGA指数运算符(V代码实现)
  8. (8)verilog语言编写UART发送
  9. ieee期刊的科技写作思路曹文平_科技论文写作与发表教程(第六版)
  10. c语言课后答案谢延红,C语言程序设计基础第4,5章 课后习题答案