列表的条目侧滑删除可以说是最熟悉不过的了,它的实现方法也有很多,这次我给大家带来的是基于RecyclerView实现的。关于RecyclerView的使用在本文中没有提及,可以看看这篇:RecyclerView的使用
先看看效果图:
大概思路为:
- 重写RecyclerView的onTochEvent方法
- 点击时,获取点击的位置,根据位置(坐标)去获取点击的条目对应的View,顺便获取条目的索引,服务于后面删除数据的逻辑。
- 滑动时,跟着手指滑动,但要防止超出边界的处理
- 松开时,获取手势、滑动的速度和条目View所在的位置,并作出对应的处理
根据以下的问题来对思路的展开
1.如何获取当前点击到的条目?
//在按下去的时(ACTION_DOWN)获取
View view = this.findChildViewUnder(startX, startY);//获取点击到的View
mViewHolder = (SlidesAdapter.SlidesViewHolder) this.findContainingViewHolder(view);//获取ViewHolder
position = mViewHolder.getAdapterPosition();//获取当前条目的所有
mItemView = mViewHolder.ContentView;
deleteView = mViewHolder.deleteView;
deleteViewWidth = deleteView.getWidth();//获取侧滑出的功能图片的宽
2.如何处理跟着手指滑动
可以使用View的ScrollBy(int x,int y)或者View的ScrollTo(int x,int y)方法,其实ScrollBy方法里边调用的是ScrollTo方法,它的源代码:
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
所以为了方便,在实现View随着手指滑动时,使用ScrollBy。
这里用图解释下mScrollX和mScrollY,其中粉红色代表View的内容:
然后还有防止把View滑动出边界,这里限制的边界是左边滑动不能超过删除图标的宽度,右边不能超出原来的边界(也就是在没有打开删除图标时,条目的内容不能向右滑动)
//滑动时的逻辑(ACTION_MOVE)
int deltaX = mLastX - startX;//<0:向右滑动、>0:向左滑动
int deltaY = mLastY - startY;
int scrollX = mItemView.getScrollX();