expandableListview实现侧滑删除

来源:互联网 发布:修改屏幕分辨率软件 编辑:程序博客网 时间:2024/05/22 10:45

本文地址: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响应

@Overridepublic 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 stubToast.makeText(context, position + "条目按下", Toast.LENGTH_SHORT).show();}});new FrontViewToMove(frontView, listView);//关键语句,使用自己写的类来对frontView的ontouch事件复写,实现视图滑动效果button.setOnClickListener(new OnClickListener() { // 为button绑定事件,可以用此按钮来实现删除事件@Overridepublic 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;// 视图所要被移动的距离,默认200private 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() {@Overridepublic 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() {@Overridepublic void onAnimationEnd(Animator animation) {}});}}


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


demo下载地址点击打开链接


0 1
原创粉丝点击