自定义RecyclerView实现QQ侧滑删除按钮
来源:互联网 发布:淘宝装修消除模块间距 编辑:程序博客网 时间:2024/06/05 00:35
【本文转载自Android 基于RecyclerView的Item侧滑删除】
通过自定义RecyclerView实现的效果为item左滑显示删除按钮,点击删除,暴露俩个接口用于调用。实测可用
这里贴出了自定义的RecyclerView,布局文件及ViewHolder没有贴出来
import android.content.Context;import android.support.annotation.Nullable;import android.support.v7.widget.RecyclerView;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.VelocityTracker;import android.view.View;import android.view.animation.LinearInterpolator;import android.widget.RelativeLayout;import android.widget.Scroller;import android.widget.TextView;public class MyRecyclerView extends RecyclerView { private Context mContext; //上一次的触摸点 private int mLastX, mLastY; //当前触摸的item的位置 private int mPosition; //item对应的布局 private RelativeLayout mItemLayout; //删除按钮 private TextView mDelete; //最大滑动距离(即删除按钮的宽度) private int mMaxLength; //是否在垂直滑动列表 private boolean isDragging; //item是在否跟随手指移动 private boolean isItemMoving; //item是否开始自动滑动 private boolean isStartScroll; //删除按钮状态 0:关闭 1:将要关闭 2:将要打开 3:打开 private int mDeleteBtnState; //检测手指在滑动过程中的速度 private VelocityTracker mVelocityTracker; private Scroller mScroller; private OnItemClickListener mListener; public MyRecyclerView(Context context) { this(context, null); } public MyRecyclerView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public MyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; mScroller = new Scroller(context, new LinearInterpolator()); mVelocityTracker = VelocityTracker.obtain(); } @Override public boolean onTouchEvent(MotionEvent e) { mVelocityTracker.addMovement(e); int x = (int) e.getX(); int y = (int) e.getY(); switch (e.getAction()) { case MotionEvent.ACTION_DOWN: if (mDeleteBtnState == 0) { View view = findChildViewUnder(x, y); if (view == null) { return false; } MyViewHolder viewHolder = (MyViewHolder ) getChildViewHolder(view); mItemLayout = viewHolder.rv_News; mPosition = viewHolder.getAdapterPosition(); mDelete = (TextView) mItemLayout.findViewById(R.id.tv_Delete); mMaxLength = mDelete.getWidth(); mDelete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mListener.onDeleteClick(mPosition); mItemLayout.scrollTo(0, 0); mDeleteBtnState = 0; } }); } else if (mDeleteBtnState == 3) { mScroller.startScroll(mItemLayout.getScrollX(), 0, -mMaxLength, 0, 200); invalidate(); mDeleteBtnState = 0; return false; } else { return false; } break; case MotionEvent.ACTION_MOVE: int dx = mLastX - x; int dy = mLastY - y; int scrollX = mItemLayout.getScrollX(); if (Math.abs(dx) > Math.abs(dy)) {//左边界检测 isItemMoving = true; if (scrollX + dx <= 0) { mItemLayout.scrollTo(0, 0); return true; } else if (scrollX + dx >= mMaxLength) {//右边界检测 mItemLayout.scrollTo(mMaxLength, 0); return true; } mItemLayout.scrollBy(dx, 0);//item跟随手指滑动 } break; case MotionEvent.ACTION_UP: if (!isItemMoving && !isDragging && mListener != null) {//item点击事件 mListener.onItemClick(mItemLayout, mPosition); } isItemMoving = false; mVelocityTracker.computeCurrentVelocity(1000);//计算手指滑动的速度 float xVelocity = mVelocityTracker.getXVelocity();//水平方向速度(向左为负) float yVelocity = mVelocityTracker.getYVelocity();//垂直方向速度 int deltaX = 0; int upScrollX = mItemLayout.getScrollX(); if (Math.abs(xVelocity) > 100 && Math.abs(xVelocity) > Math.abs(yVelocity)) { if (xVelocity <= -100) {//左滑速度大于100,则删除按钮显示 deltaX = mMaxLength - upScrollX; mDeleteBtnState = 2; } else if (xVelocity > 100) {//右滑速度大于100,则删除按钮隐藏 deltaX = -upScrollX; mDeleteBtnState = 1; } } else { if (upScrollX >= mMaxLength / 2) {//item的左滑动距离大于删除按钮宽度的一半,则显示删除按钮 deltaX = mMaxLength - upScrollX; mDeleteBtnState = 2; } else if (upScrollX < mMaxLength / 2) {//否则隐藏 deltaX = -upScrollX; mDeleteBtnState = 1; } } //item自动滑动到指定位置 mScroller.startScroll(upScrollX, 0, deltaX, 0, 200); isStartScroll = true; invalidate(); mVelocityTracker.clear(); break; } mLastX = x; mLastY = y; return super.onTouchEvent(e); } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { mItemLayout.scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); invalidate(); } else if (isStartScroll) { isStartScroll = false; if (mDeleteBtnState == 1) { mDeleteBtnState = 0; } if (mDeleteBtnState == 2) { mDeleteBtnState = 3; } } } @Override protected void onDetachedFromWindow() { mVelocityTracker.recycle(); super.onDetachedFromWindow(); } @Override public void onScrollStateChanged(int state) { super.onScrollStateChanged(state); isDragging = state == SCROLL_STATE_DRAGGING; } public void setOnItemClickListener(OnItemClickListener listener) { mListener = listener; } public interface OnItemClickListener { /** * item点击回调 * * @param view * @param position */ void onItemClick(View view, int position); /** * 删除按钮回调 * * @param position */ void onDeleteClick(int position); }}
代码到此为止,这个是在网上找了很多自定义RecyclerView实现侧滑删除里最好用的,如侵删。
阅读全文
0 0
- 自定义RecyclerView实现QQ侧滑删除按钮
- 自定义View(仿QQ侧滑删除实现,ViewDragHelper)
- 自定义SwipeLayout控件实现ListView条目侧滑出现删除按钮,点击实现删除ListView条目
- 自定义ListView实现仿QQ消息列表滑动item出现删除按钮
- 自定义仿QQ侧滑删除
- 仿QQ侧滑删除,自定义ListView
- 详解RecyclerView+BGARefreshLayout实现自定义下拉刷新、上拉加载和侧滑删除效果
- 详解RecyclerView+BGARefreshLayout实现自定义下拉刷新、上拉加载和侧滑删除效果
- Android-详解RecyclerView+BGARefreshLayout实现自定义下拉刷新、上拉加载和侧滑删除效果
- ItemTouchHleper实现RecyclerView侧滑删除
- ListView 仿QQ侧滑显示删除按钮
- 自定义view系列(5)--99.99%实现QQ侧滑删除效果
- 自定义view系列(5)--99.99%实现QQ侧滑删除效果
- 自定义view系列(5)--99.99%实现QQ侧滑删除效果
- RecyclerView侧滑删除
- recyclerview侧滑删除
- RecyclerView侧滑删除
- Android仿QQ侧滑删除实现
- UI 一一 loadView、viewDidLoad及viewDidUnload的关系
- 机器学习之线性模型
- 百度云一面--面经
- TypeScript使用心得
- JVM -XX: 参数介绍
- 自定义RecyclerView实现QQ侧滑删除按钮
- 编译时报错: error: <strong>two or more data types in declaration specifiers</strong> error:two or more
- MYSQL-创建数据表
- 常见网络攻击方式
- UVa1062
- [iOS]系统TabBar简单使用
- c拾遗
- 震网三代在metasploit-framework上的复现与利用
- 浅谈机器学习用来做什么,它是如果工作的