自定义Listview,向左滑动,右边刚好显示删除按钮:

  1. public class SlideListView extends ListView {
    private int mScreenWidth; // 屏幕宽度
    private int mDownX; // 按下点的x值
    private int mDownY; // 按下点的y值
    private int mDeleteBtnWidth;// 删除按钮的宽度
  2.  
  3. private boolean isDeleteShown; // 删除按钮是否正在显示
  4.  
  5. private ViewGroup mPointChild; // 当前处理的item
    private LinearLayout.LayoutParams mLayoutParams; // 当前处理的item的LayoutParams
  6.  
  7. public SlideListView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
    }
  8.  
  9. public SlideListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  10.  
  11. // 获取屏幕宽度
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics dm = new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(dm);
    mScreenWidth = dm.widthPixels;
    }
  12.  
  13. @Override
    public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
    performActionDown(ev);
    break;
    case MotionEvent.ACTION_MOVE:
    return performActionMove(ev);
    case MotionEvent.ACTION_UP:
    performActionUp();
    break;
    }
  14.  
  15. return super.onTouchEvent(ev);
    }
  16.  
  17. // 处理action_down事件
    private void performActionDown(MotionEvent ev) {
    if (isDeleteShown) {
    turnToNormal();
    }
  18.  
  19. mDownX = (int) ev.getX();
    mDownY = (int) ev.getY();
    // 获取当前点的item
    mPointChild = (ViewGroup) getChildAt(pointToPosition(mDownX, mDownY)
    - getFirstVisiblePosition());
    // 获取删除按钮的宽度
    mDeleteBtnWidth = mPointChild.getChildAt(1).getLayoutParams().width;
    mLayoutParams = (LinearLayout.LayoutParams) mPointChild.getChildAt(0)
    .getLayoutParams();
    mLayoutParams.width = mScreenWidth;
    mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    }
  20.  
  21. // 处理action_move事件
    private boolean performActionMove(MotionEvent ev) {
    int nowX = (int) ev.getX();
    int nowY = (int) ev.getY();
    if (Math.abs(nowX - mDownX) > Math.abs(nowY - mDownY)) {
    // 如果向左滑动
    if (nowX < mDownX) {
    // 计算要偏移的距离
    int scroll = (nowX - mDownX) / 2;
    // 如果大于了删除按钮的宽度, 则最大为删除按钮的宽度
    if (-scroll >= mDeleteBtnWidth) {
    scroll = -mDeleteBtnWidth;
    }
    // 重新设置leftMargin
    mLayoutParams.leftMargin = scroll;
    // mLayoutParams.leftMargin = scroll*2;
    mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    }
    // return true;
    }
    return super.onTouchEvent(ev);
    }
  22.  
  23. // 处理action_up事件
    private void performActionUp() {
    // 偏移量大于button的一半,则显示button
    // 否则恢复默认
    if (-mLayoutParams.leftMargin >= mDeleteBtnWidth / 2) {
    mLayoutParams.leftMargin = -mDeleteBtnWidth;
    // mLayoutParams.leftMargin = -mDeleteBtnWidth * 2;
    isDeleteShown = true;
    } else {
    turnToNormal();
    }
  24.  
  25. mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    }
  26.  
  27. /**
    * 变为正常状态
    */
    public void turnToNormal() {
    mLayoutParams.leftMargin = 0;
    mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    isDeleteShown = false;
    }
  28.  
  29. /**
    * 当前是否可点击
    *
    * @return 是否可点击
    */
    public boolean canClick() {
    return !isDeleteShown;
    }
  30.  
  31. @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//与scrollview嵌套需要重新计算高度
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
    MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, expandSpec);
    }
    }
  32.  
  33. 适配器:
  1. public class ListViewSlideAdapter extends BaseAdapter {
  2.  
  3. private ArrayList<String> bulbList;
    private Activity context;
    private OnClickListenerEditOrDelete onClickListenerEditOrDelete;
  4.  
  5. public ListViewSlideAdapter(Activity context, ArrayList<String> bulbList) {
  1. this.bulbList = bulbList;
    this.context = context;
    }
  2. public void setmNews(ArrayList<String> mNews) {
    this.bulbList = mNews;
    }
  3. @Override
    public int getCount() {
    return bulbList.size();
    }
  4. @Override
    public Object getItem(int position) {
    return bulbList.get(position);
    }
  5. @Override
    public long getItemId(int position) {
    return position;
    }
  6. @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
    final String str = bulbList.get(position);
    ViewHolder viewHolder;
    if (null == convertView) {
    convertView = context.getLayoutInflater().inflate(R.layout.lay_list_collection_item, null);
    viewHolder = new ViewHolder(convertView);
    convertView.setTag(viewHolder);//store up viewHolder
    } else {
    viewHolder = (ViewHolder) convertView.getTag();
    }
    viewHolder.tvDelete.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    if (onClickListenerEditOrDelete != null) {
    onClickListenerEditOrDelete.OnClickListenerDelete(position);
    }
    }
    });
  7. if (!TextUtils.isEmpty(str.)) {
    viewHolder.mTv.setText("" + str);
    }
  8. return convertView;
    }
  9. public void setOnClickListenerEditOrDelete(OnClickListenerEditOrDelete onClickListenerEditOrDelete1) {
    this.onClickListenerEditOrDelete = onClickListenerEditOrDelete1;
    }
  10. public interface OnClickListenerEditOrDelete {
    void OnClickListenerDelete(int position);
    }
  11. private class ViewHolder {
  12. TextView mTv;
  13. TextView tvDelete;
  14. ViewHolder(View view) {
  15. mTv = (TextView) view.findViewById(R.id.tv_title);
  16. tvDelete = (TextView) view.findViewById(R.id.tv_delete);
    }
    }
  17. }
  18. Item布局:
  1. <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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="match_parent"
    android:background="@color/white"
    android:orientation="horizontal">
  2.  
  3. <TextView
    android:id="@+id/tv_title"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
  1. android:layout_weight="1"
    android:maxLength="@integer/maxlength"
  2. android:textColor="@color/black"
    android:textSize="@dimen/text_16" />
  3. <TextView
    android:id="@+id/tv_delete"
    android:layout_width="60dp"
    android:layout_height="match_parent"
    android:layout_marginLeft="@dimen/panding_5"
    android:background="@color/color_26"
    android:gravity="center"
    android:text="删除"
    android:textColor="@color/text_f7"
    android:textSize="@dimen/text_16" />
  4. </LinearLayout>
  5. 布局:
  1. <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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="match_parent"
    android:fitsSystemWindows="true"
    android:background="@color/color_f4"
    android:orientation="vertical">
  2.  
  3. <View
    android:layout_width="match_parent"
    android:layout_height="@dimen/margin_1"
    android:background="@color/color_line_ae" />
  4.  
  5. <...PullToRefreshScrollView
    android:id="@+id/pull_refresh_scrollview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    app:ptrAnimationStyle="flip"
    app:ptrMode="both">
  6.  
  7. <...SlideListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="@dimen/panding_5"
    android:layout_marginRight="@dimen/panding_5"
    android:divider="@null"
    android:dividerHeight="0dp" />
  8.  
  9. </...PullToRefreshScrollView>
  10.  
  11. <TextView
    android:id="@+id/tv_notic"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:gravity="center_horizontal"
    android:paddingTop="20dp"
    android:text="暂无收藏"
    android:visibility="gone" />
  1.  
  1. 例子:
  1. mListCollectionAdapter = new ListViewSlideAdapter(this, mMessageReceive);
    mListView.setAdapter(mListCollectionAdapter);
  2.  
  3. mListView.setOnItemClickListener(this);
    mListCollectionAdapter.setOnClickListenerEditOrDelete(new ListViewSlideAdapter.OnClickListenerEditOrDelete() {
    @Override
    public void OnClickListenerDelete(int position) {
    //删除按钮点击事件
    }
    });

listview侧滑删除的更多相关文章

  1. QQ视差特效和ListView侧滑删除

    如图所示是效果图,当向下拉时,图片会被拉出来,松手后恢复.和ListView的侧滑删除   1.视差特效 首先图片是通过addHeaderView加上去的,所以在设置Adapter前先设置一个View ...

  2. Android 自定义ListView Item侧滑删除

    本程序是基于网上开源项目修改而来,具体来源忘了,懒得搜了,如果有不合适的地方,请原作者联系我,我会及时回复和处理的! 该例子程序中主要包含两个ListView,一个是实现侧滑删除,一个是侧滑出菜单,代 ...

  3. 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。

    重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...

  4. 记一个SwipeMenuListView侧滑删除错乱的Bug

    做侧滑删除网上有很多方案,比如重写Listview实现滑动的监听,今天说下一个SwipeListView,这个是之前一个朋友在网上开源的一个封装组件,能够适用于多种情况,项目地址:https://gi ...

  5. Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper

    RecyclerView这个被誉为ListView和GirdView的替代品,它的用法在之前的一篇博文中就已经讲过了,今天我们就来实现RecyclerView的侧滑删除和长按拖拽功能,实现这两个功能我 ...

  6. android--------ListView和ExpandableListView的侧滑删除操作

    本案例主要实现了ListView和ExpandableListView的侧滑删除操作功能 效果图: ListView的Adapter类 private class SlideAdapter exten ...

  7. xamarin.android pullToRefresharp.Android下拉刷新样式、侧滑删除功能

    如果你正则使用xamarin.From开发项目,那么listview一定是你比不可少的控件.但是由于xamarin的listview在安卓上的功能有限,所以经常需要使用Renderers来改写平台实现 ...

  8. QQ 特效学习 二 侧滑删除

    上篇文章: http://www.cnblogs.com/xurui1995/p/5798631.html 今天来写不仅是qq而且在别的软件上也特别流行的侧滑删除 其实套路和前篇的一样,一个自定义Vi ...

  9. flutter 侧滑删除+侧滑显示删除按钮

    1.侧滑删除 1.1.Dismissible组件 2.侧滑显示删除按钮 2.1.手势监听水平滑动 ------------------------------------分割线------------ ...

随机推荐

  1. Vue.js——基于$.ajax实现数据的跨域增删查改

    概述 之前我们学习了Vue.js的一些基础知识,以及如何开发一个组件,然而那些示例的数据都是local的.在实际的应用中,几乎90%的数据是来源于服务端的,前端和服务端之间的数据交互一般是通过ajax ...

  2. Lesson 18 He often does this!

    Text After I had had lunch at a village pub, I looked for my bag. I had left it on a chair beside th ...

  3. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  4. No result defined for action com.lk.IndexAction and result success

    意图访问一个 /es/index.action 竟然出现: [SAE ] ERROR [05-11 13:54:32] [http-80-5] com.opensymphony.xwork2.util ...

  5. 关于百度编辑器UEditor的一点说明

    大家在使用的时候要特别注意editor_config.js中的“URL”这个参数 我的理解:1.这个参数是editor整个结构的总路径          2.首先要把这个路径配置好了.才能正常的显示, ...

  6. PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式

    PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...

  7. 前端开发工具vue.js开发实践总结

    最近有很长时间没有更新博客了,换了公司,全部的心思都放在项目上了.通过这次项目的上线,让我感受最深的是前后端分离后,前端页面的模块化管理,以及前端页面的数据邦定.在接触vue.js之前,我之前端要用到 ...

  8. Vertica 高可用性测试

    1.基本概念介绍 2.停止某节点服务 3.测试其他节点访问 1.基本概念介绍 Vertica也是MPP架构的数据库,相比大家熟悉的MPP架构,比如Greenplum和hadoop这些产品,Vertic ...

  9. WebGIS中基于控制点库进行SHP数据坐标转换的一种查询优化策略

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 目前项目中基于控制点库进行SHP数据的坐标转换,流程大致为:遍 ...

  10. 利用C#开发移动跨平台Hybrid App(一):从Native端聊Hybrid的实现

    0x00 前言 前一段时间分别读了两篇博客,分别是叶小钗兄的<浅谈Hybrid技术的设计与实现>以及徐磊哥的<从技术经理的角度算一算,如何可以多快好省的做个app>.受到了很多 ...