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实现上下覆盖,我们移动的就是上面的一层
重写expandableListview适配器的item项的点击和ontouch响应
最后,从swipelistview中提取的,实现动画效果,和屏蔽listview上下滚动的关键类。
最后一个类,完全可以当做工具类来使用,单独的控件,listview及其子类都适用此方法。
demo下载地址点击打开链接
使用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下载地址点击打开链接
相关文章推荐
- Android listview 侧滑 SwipeListView 详解 实现微信,QQ等滑动删除效果
- 利用 SwipeDismissListViewTouchListener 实现左右侧滑删除条目 item
- Androidlistview 的侧滑删除仿的QQ效果的几种实现方式
- Android listView item侧滑实现删除和置顶功能
- 自定义listview,实现Item侧滑显示删除、置顶按钮
- android--------ListView和ExpandableListView的侧滑删除操作
- SwipeMenuListView实现类似于QQ侧滑删除效果
- 仿QQ侧滑删除Item:Swipemenulistview的简单实现
- 自定义SwipeLayout控件实现ListView条目侧滑出现删除按钮,点击实现删除ListView条目
- ListView侧滑删除的实现,利用SwipemenuListView开源框架
- SwipeMenuListView实现点击和侧滑删除
- ExpandableListView侧滑删除
- Android ListView 侧滑效果实现(滑动展开、滑动删除)
- Android ListView 侧滑效果实现(滑动展开、滑动删除)
- android--------ListView和ExpandableListView的侧滑删除操作
- ListView侧滑删除的实现,SlideDeleteListView,针对ScrollView嵌套ListView视图和手势冲突优化
- ExpandableListView 和SwipeLayout 实现双层列表 ,childitem 滑动删除效果
- Android侧滑删除另一种实现,SwipeListView补充
- ListView侧滑删除的实现,SlideDeleteListView,针对ScrollView嵌套ListView视图和手势冲突优化
- Android自定义ListView实现仿微信侧滑删除