expandableListview实现侧滑删除

本文地址:http://blog.csdn.net/xiehao_95/article/details/44628491


使用swipelistview实现侧滑删除这样Demo已经很普及了,但是项目需要,expandableListview的item也要实现侧滑删除,参照swipelistview的ontouch事件,对getChildItem中的每个item设置点击事件以及ontouch事件。


使用到的jar包nineoldandroids-2.4.0.jar。


废话不多说上代码

首先,item项的布局文件,由FrameLayout实现上下覆盖,我们移动的就是上面的一层


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/id_back"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:gravity="right" >

        <Button
            android:id="@+id/btn_delete"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:background="#00ffff"
            android:text="delete" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/id_front"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:background="#00ff00"
        android:gravity="center" >

        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
    </LinearLayout>

</FrameLayout>


重写expandableListview适配器的item项的点击和ontouch响应

@Override
	public View getChildView(int groupPosition, final int position,
			boolean arg2, View convertView, ViewGroup parent) {

		convertView = LayoutInflater.from(context).inflate(R.layout.list_item,
				null);
		button = (Button) convertView.findViewById(R.id.btn_delete);
		textView = (TextView) convertView.findViewById(R.id.text);
		frontView = convertView.findViewById(R.id.id_front);

		frontView.setOnClickListener(new OnClickListener() {
		//因为重写ontouch事件使onChildClickListener失效,需要设置次监听来补救
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(context, position + "条目按下", Toast.LENGTH_SHORT)
						.show();
			}
		});

		new FrontViewToMove(frontView, listView);
		//关键语句,使用自己写的类来对frontView的ontouch事件复写,实现视图滑动效果
		
		button.setOnClickListener(new OnClickListener() { 
		// 为button绑定事件,可以用此按钮来实现删除事件

			@Override
			public void onClick(View v) {

				Toast.makeText(context, position + "按钮按下", Toast.LENGTH_SHORT)
						.show();

			}
		});

		textView.setTextSize(20);
		textView.setTextColor(Color.DKGRAY);
		textView.setText(ChildrenItem[groupPosition][position]);

		return convertView;

	}

 

最后,从swipelistview中提取的,实现动画效果,和屏蔽listview上下滚动的关键类。

 
</pre><pre name="code" class="java">package com.example.movetodelete;

import static com.nineoldandroids.view.ViewHelper.setTranslationX;
import static com.nineoldandroids.view.ViewPropertyAnimator.animate;
import android.annotation.SuppressLint;
import android.support.v4.view.MotionEventCompat;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ListView;

import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.AnimatorListenerAdapter;

/**
 * @author XieHao
 * 
 */
@SuppressLint({ "ClickableViewAccessibility", "Recycle" })
public class FrontViewToMove {

	private View frontView;// 所要滑动的视图
	private int downX;// 手指按下时的x坐标
	private boolean hasMoved = false;// 判断视图是否被移动
	private int xToMove = 200;// 视图所要被移动的距离,默认200
	private ListView listView;// 如果所需移动的视图为ListView或其子类的item项,传入视图容器,限制其上下滚动

	/**
	 * @param frontView
	 *            所要滑动的视图
	 */
	public FrontViewToMove(View frontView) {
		this.frontView = frontView;
		moveListener();
	}

	/**
	 * @param frontView
	 *            所要滑动的视图
	 * @param xToMove
	 *            视图所要被移动的距离
	 */
	public FrontViewToMove(View frontView, int xToMove) {
		this.frontView = frontView;
		this.xToMove = xToMove;
		moveListener();
	}

	/**
	 * @param frontView
	 *            所要滑动的视图
	 * @param listView
	 *            所要滑动的视图的容器
	 */
	public FrontViewToMove(View frontView, ListView listView) {
		this.frontView = frontView;
		this.listView = listView;
		moveListener();
	}

	/**
	 * @param frontView
	 *            所要滑动的视图
	 * @param listView
	 *            所要滑动的视图的容器
	 * @param xToMove
	 *            视图所要被移动的距离
	 */
	public FrontViewToMove(View frontView, ListView listView, int xToMove) {
		this.frontView = frontView;
		this.listView = listView;
		this.xToMove = xToMove;
		moveListener();
	}

	/**
	 * 设置frontView的OnTouch监听,使其产生滑动的动画效果
	 */
	public void moveListener() {
		frontView.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View view, MotionEvent motionEvent) {

				switch (MotionEventCompat.getActionMasked(motionEvent)) {
				case MotionEvent.ACTION_DOWN: {

					downX = (int) motionEvent.getRawX();
					if (hasMoved) {
						downX = downX + xToMove;
					} else {
						view.onTouchEvent(motionEvent);// 当视图没有被移动,返回事件,使点击事件可用。
					}
					return true;
				}

				case MotionEvent.ACTION_UP: {

					float deltaX = motionEvent.getRawX() - downX;
					boolean swap = false;

					if ((deltaX > -xToMove / 2 && hasMoved)
							|| (deltaX < -xToMove && !hasMoved)) {
						swap = true;
					}

					if (swap) {
						if (!hasMoved) {
							generateRevealAnimate(frontView, -xToMove);
							hasMoved = true;
						} else {
							generateRevealAnimate(frontView, 0);
							hasMoved = false;
						}
					} else {
						if (hasMoved) {
							generateRevealAnimate(frontView, -xToMove);
						} else {
							generateRevealAnimate(frontView, 0);
						}
					}

					break;
				}

				case MotionEvent.ACTION_MOVE: {
					float deltaX = motionEvent.getRawX() - downX;

					MotionEvent cancelEvent = MotionEvent.obtain(motionEvent);

					cancelEvent.setAction(MotionEvent.ACTION_CANCEL
							| (motionEvent.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));

					if (deltaX < -10) {
						view.onTouchEvent(cancelEvent);// 当滑动时清空该视图的点击事件
						if (null != listView) {// 当视图滑动时限制listView的上下滚动
							listView.requestDisallowInterceptTouchEvent(false);
							listView.onTouchEvent(cancelEvent);
						}
					}

					if (!(deltaX > 0 && !hasMoved)) {
						setTranslationX(frontView, deltaX);
					}
					return true;
				}
				}
				return false;
			}
		});

	}

	/**
	 * @param view
	 *            所要移动的视图
	 * @param deltaX
	 *            最终移动的距离
	 */
	private void generateRevealAnimate(final View view, float deltaX) {
		int moveTo = 0;
		moveTo = (int) deltaX;
		animate(view).translationX(moveTo).setDuration(10)
				.setListener(new AnimatorListenerAdapter() {
					@Override
					public void onAnimationEnd(Animator animation) {

					}
				});
	}

}


 

最后一个类,完全可以当做工具类来使用,单独的控件,listview及其子类都适用此方法。


demo下载地址点击打开链接


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值