Recyclerview实现侧滑删除功能,也可以自己修改条目布局的代码就可以实现其他菜单
上代码
MainActivity
package com.exemple.kx.demo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RvAdapter mRvAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.rv);
initData();
}
private void initData() {
recyclerView.setLayoutManager(new LinearLayoutManager(this));
mRvAdapter = new RvAdapter(this);
recyclerView.setAdapter(mRvAdapter);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
mRvAdapter.setScrollingMenu(null);
}
});
}
}
Adapter类:
package com.exemple.kx.demo;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
/**
* Created by admin on 2018/6/29.
*/
public class RvAdapter extends RecyclerView.Adapter {
private Context context;
private RvSlideLayout mOpenMenu;
private RvSlideLayout mScrollingMenu;
public RvAdapter(Context context) {
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(context).inflate(R.layout.item_show_phone, parent, false);
ViewHolder viewHolder = new ViewHolder(inflate);
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ViewHolder viewHolder = (ViewHolder) holder;
viewHolder.mTextView.setText(position+"");
}
@Override
public int getItemCount() {
return 20;
}
public void setScrollingMenu(RvSlideLayout scrollingMenu) {
mScrollingMenu = scrollingMenu;
}
public RvSlideLayout getScrollingMenu() {
return mScrollingMenu;
}
public void closeOpenMenu() {
if (mOpenMenu != null && mOpenMenu.isOpen()) {
mOpenMenu.closeMenu();
mOpenMenu = null;
}
}
public void holdOpenMenu(RvSlideLayout rvSlideLayout) {
mOpenMenu = rvSlideLayout;
}
class ViewHolder extends RecyclerView.ViewHolder {
RvSlideLayout slidlayouts;
TextView mTextView;
Button mButton;
public ViewHolder(View itemView) {
super(itemView);
slidlayouts = itemView.findViewById(R.id.slidlayout);
mTextView = itemView.findViewById(R.id.tv);
mButton = itemView.findViewById(R.id.btn_dele);
}
}
}
RvSlideLayout类:
package com.exemple.kx.demo;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
public class RvSlideLayout extends HorizontalScrollView {
//菜单占屏幕宽度比
private static final float radio = 0.2f;
private final int mScreenWidth;
private final int mMenuWidth;
private boolean once = true;
private boolean isOpen;
public RvSlideLayout(final Context context, AttributeSet attrs) {
super(context, attrs);
mScreenWidth = ScreenUtil.getScreenWidth(context);
mMenuWidth = (int) (mScreenWidth * radio);
setOverScrollMode(View.OVER_SCROLL_NEVER);
setHorizontalScrollBarEnabled(false);
}
/**
* 关闭菜单
*/
public void closeMenu() {
this.smoothScrollTo(0, 0);
isOpen = false;
}
/**
* 菜单是否打开
*/
public boolean isOpen() {
return isOpen;
}
/**
* 获取 adapter
*/
private RvAdapter getAdapter() {
View view = this;
while (true) {
view = (View) view.getParent();
if (view instanceof RecyclerView) {
break;
}
}
return (RvAdapter) ((RecyclerView) view).getAdapter();
}
/**
* 当打开菜单时记录此 view ,方便下次关闭
*/
private void onOpenMenu() {
getAdapter().holdOpenMenu(this);
isOpen = true;
}
/**
* 当触摸此 item 时,关闭上一次打开的 item
*/
private void closeOpenMenu() {
if (!isOpen) {
getAdapter().closeOpenMenu();
}
}
/**
* 获取正在滑动的 item
*/
public RvSlideLayout getScrollingMenu() {
return getAdapter().getScrollingMenu();
}
/**
* 设置本 item 为正在滑动 item
*/
public void setScrollingMenu(RvSlideLayout scrollingMenu) {
getAdapter().setScrollingMenu(scrollingMenu);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (once) {
LinearLayout wrapper = (LinearLayout) getChildAt(0);
wrapper.getChildAt(0).getLayoutParams().width = mScreenWidth;
wrapper.getChildAt(1).getLayoutParams().width = mMenuWidth;
once = false;
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (getScrollingMenu() != null && getScrollingMenu() != this) {
return false;
}
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downTime = System.currentTimeMillis();
closeOpenMenu();
setScrollingMenu(this);
break;
case MotionEvent.ACTION_UP:
setScrollingMenu(null);
int scrollX = getScrollX();
if (System.currentTimeMillis() - downTime <= 100 && scrollX == 0) {
if (mCustomOnClickListener != null) {
mCustomOnClickListener.onClick();
}
return false;
}
if (Math.abs(scrollX) > mMenuWidth / 2) {
this.smoothScrollTo(mMenuWidth, 0);
onOpenMenu();
} else {
this.smoothScrollTo(0, 0);
}
return false;
}
return super.onTouchEvent(ev);
}
long downTime = 0;
interface CustomOnClickListener {
void onClick();
}
private CustomOnClickListener mCustomOnClickListener;
void setCustomOnClickListener(CustomOnClickListener listener) {
this.mCustomOnClickListener = listener;
}
}
ScreenUtil类:
package com.exemple.kx.demo;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.WindowManager;
public class ScreenUtil {
public static int getScreenWidth(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.widthPixels;
}
}