实现原理其实很简单,主要是利用自定义HorizontalScrollView平移的方式实现,判断左滑的距离是否大于左滑显示的布局的宽度,如果是的话,则进行左滑操作,否则隐藏
/**
* 6.按滚动条被拖动距离判断关闭或打开菜单
* getScrollX() view的左上角相对于母视图的左上角的X轴偏移量
* smoothScrollTo(x, y); 参数:相对于ScrollView左上角的位置来说,你要移动的位置
*/
public void changeScrollx() {
if (getScrollX() >= (mScrollWidth / 2)) {
this.smoothScrollTo(mScrollWidth, 0);
isOpen = true;
mIonSlidingButtonListener.onMenuIsOpen(this);
} else {
this.smoothScrollTo(0, 0);
isOpen = false;
}
}
好吧,这个文章我只是转载的,为了方便自己以后参考转的
下面开始直接上这个大佬写的代码,核心是这个自定义View
**
* recycleView 左滑view
*/
public class LeftSlideView extends HorizontalScrollView {
private Boolean once = false;//在onMeasure中只执行一次的判断
private TextView mTextView_Delete;//删除按钮
private int mScrollWidth;//记录滚动条可以滚动的距离
private IonSlidingButtonListener mIonSlidingButtonListener;//自定义的接口,用于传达滑动事件等
private Boolean isOpen = false;//记录按钮菜单是否打开,默认关闭false
/**
* 1.构造方法
*/
public LeftSlideView(Context context) {
super(context, null);
}
public LeftSlideView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
}
public LeftSlideView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.setOverScrollMode(OVER_SCROLL_NEVER);
}
//2.在onMeasure中先取得作为“设置”、“删除”按钮的TextView
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (!once) {
mTextView_Delete = (TextView) findViewById(R.id.tv_delete);
once = true;
}
}
//3.在onLayout中使Item在每次变更布局大小时回到初始位置,并且获取滚动条的可移动距离
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (changed) {
this.scrollTo(0, 0);
//获取水平滚动条可以滑动的范围,即右侧“设置”、“删除”按钮的总宽度
mScrollWidth = mTextView_Delete.getWidth();
}
}
//4.滑动监听,按滑动的距离大小控制菜单开关
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN://按下
case MotionEvent.ACTION_MOVE://移动
mIonSlidingButtonListener.onDownOrMove(this);
break;
case MotionEvent.ACTION_UP://松开
case MotionEvent.ACTION_CANCEL:
changeScrollx();
return true;
default:
break;
}
return super.onTouchEvent(ev);
}
/**
* 5.
* @param l
* @param t
* @param oldl
* @param oldt
*/
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
//改变view的在x轴方向的位置
mTextView_Delete.setTranslationX(1);
}
/**
* 6.按滚动条被拖动距离判断关闭或打开菜单
* getScrollX() view的左上角相对于母视图的左上角的X轴偏移量
* smoothScrollTo(x, y); 参数:相对于ScrollView左上角的位置来说,你要移动的位置
*/
public void changeScrollx() {
if (getScrollX() >= (mScrollWidth / 2)) {
this.smoothScrollTo(mScrollWidth, 0);
isOpen = true;
mIonSlidingButtonListener.onMenuIsOpen(this);
} else {
this.smoothScrollTo(0, 0);
isOpen = false;
}
}
/**
* 7.打开菜单
*/
public void openMenu() {
if (isOpen) {
return;
}
this.smoothScrollTo(mScrollWidth, 0);//相对于原来没有滑动的位置x轴方向偏移了mScrollWidth,y轴方向没有变化。
isOpen = true;
mIonSlidingButtonListener.onMenuIsOpen(this);
}
/**
* 8.关闭菜单
*/
public void closeMenu() {
if (!isOpen) {
return;
}
this.smoothScrollTo(0, 0);//相对于原来没有滑动的位置,x轴方向、y轴方向都没有变化,即回到原来的位置了。
isOpen = false;
}
/**
* 9.接口定义及注册方法
*/
public void setSlidingButtonListener(IonSlidingButtonListener listener) {
mIonSlidingButtonListener = listener;
}
public interface IonSlidingButtonListener {
//该方法在Adapter中实现
void onMenuIsOpen(View view);//判断菜单是否打开
void onDownOrMove(LeftSlideView leftSlideView);//滑动或者点击了Item监听
}
}
然后item中
《你自己的item布局》
然后adapter中
public class LotteryListAdapter extends BaseQuickAdapter implements LeftSlideView.IonSlidingButtonListener{
private IonSlidingViewClickListener mIDeleteBtnClickListener;
private LeftSlideView mMenu = null;
public LotteryListAdapter(int layoutResId,IonSlidingViewClickListener listener) {
super(layoutResId);
this.mIDeleteBtnClickListener=listener;
}
@Override
protected void convert(MyViewHolder helper, itemBean item) {
LinearLayout layout_content=helper.getView(R.id.layout_content);
layout_content.getLayoutParams().width = SizeUtil.getScreenWidth(mContext)-SizeUtil.dp2px(mContext,20);
layout_content.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判断是否有删除菜单打开
if (menuIsOpen()) {
closeMenu();//关闭菜单
} else {
mIDeleteBtnClickListener.onItemClick(v, helper.getLayoutPosition());
}
}
});
helper.getView(R.id.tv_delete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mIDeleteBtnClickListener.onDeleteBtnCilck(v, helper.getLayoutPosition());
}
});
//你们自己的item逻辑
}
class MyViewHolder extends BaseViewHolder{
public MyViewHolder(View view) {
super(view);
((LeftSlideView) view).setSlidingButtonListener(LotteryListAdapter.this);
}
}
@Override
public void onMenuIsOpen(View view) {
LogUtil.e("左滑","onMenuIsOpen");
mMenu = (LeftSlideView) view;
}
@Override
public void onDownOrMove(LeftSlideView leftSlideView) {
LogUtil.e("左滑","onDownOrMove");
if (menuIsOpen()) {
if (mMenu != leftSlideView) {
closeMenu();
}
}
}
/**
* 关闭菜单
*/
public void closeMenu() {
mMenu.closeMenu();
mMenu = null;
}
/**
* 判断菜单是否打开
*
* @return
*/
public Boolean menuIsOpen() {
if (mMenu != null) {
return true;
}
return false;
}
/**
* 注册接口的方法:点击事件。在Mactivity.java实现这些方法。
*/
public interface IonSlidingViewClickListener {
void onItemClick(View view, int position);//点击item正文
void onDeleteBtnCilck(View view, int position);//点击“删除”
}
}
效果如下:
参考:
RecyclerView 左滑(仿QQ左滑删除)_江小虫儿的博客-CSDN博客