您的位置:首页 > 其它

expandableListview实现侧滑删除

2015-03-25 21:56 274 查看
本文地址:/article/8145944.html

使用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下载地址点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: