Android(安卓)RecyclerView 滑动删除例子
16lz
2021-12-04
效果图
1.自定义Item容器View,SlidingButtonView.java
package com.android.mx.myapplication;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.HorizontalScrollView;import android.widget.TextView;/** * Created by Administrator on 2016-11-11. */public class SlidingButtonView extends HorizontalScrollView { private TextView mTextView_Delete; private int mScrollWidth; private IonSlidingButtonListener mIonSlidingButtonListener; private Boolean isOpen = false; private Boolean once = false; public SlidingButtonView(Context context) { this(context, null); } public SlidingButtonView(Context context, AttributeSet attrs) { this(context, attrs,0); } public SlidingButtonView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.setOverScrollMode(OVER_SCROLL_NEVER); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if(!once){ mTextView_Delete = (TextView) findViewById(R.id.tv_delete); once = true; } } @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(); Log.i("asd", "mScrollWidth:" + mScrollWidth); } } @Override public boolean onTouchEvent(MotionEvent 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); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); mTextView_Delete.setTranslationX(l - mScrollWidth); } /** * 按滚动条被拖动距离判断关闭或打开菜单 */ public void changeScrollx(){ if(getScrollX() >= (mScrollWidth/2)){ this.smoothScrollTo(mScrollWidth, 0); isOpen = true; mIonSlidingButtonListener.onMenuIsOpen(this); }else{ this.smoothScrollTo(0, 0); isOpen = false; } } /** * 打开菜单 */ public void openMenu() { if (isOpen){ return; } this.smoothScrollTo(mScrollWidth, 0); isOpen = true; mIonSlidingButtonListener.onMenuIsOpen(this); } /** * 关闭菜单 */ public void closeMenu() { if (!isOpen){ return; } this.smoothScrollTo(0, 0); isOpen = false; } public void setSlidingButtonListener(IonSlidingButtonListener listener){ mIonSlidingButtonListener = listener; } public interface IonSlidingButtonListener{ void onMenuIsOpen(View view); void onDownOrMove(SlidingButtonView slidingButtonView); }}
2.定义每个Item的XML,layout_item.xml
3定义Adapter,Adapter.java
package com.android.mx.myapplication;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.TextView;import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2016-11-11. */public class Adapter extends RecyclerView.Adapter implements SlidingButtonView.IonSlidingButtonListener { private Context mContext; private IonSlidingViewClickListener mIDeleteBtnClickListener; private List mDatas = new ArrayList(); private SlidingButtonView mMenu = null; public Adapter(Context context) { mContext = context; mIDeleteBtnClickListener = (IonSlidingViewClickListener) context; for (int i = 0; i < 10; i++) { mDatas.add(i + ""); } } @Override public int getItemCount() { return mDatas.size(); } @Override public void onBindViewHolder(final MyViewHolder holder, int position) { holder.textView.setText(mDatas.get(position)); //设置内容布局的宽为屏幕宽度 holder.layout_content.getLayoutParams().width = Utils.getScreenWidth(mContext); holder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //判断是否有删除菜单打开 if (menuIsOpen()) { closeMenu();//关闭菜单 } else { int n = holder.getLayoutPosition(); mIDeleteBtnClickListener.onItemClick(v, n); } } }); holder.btn_Delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int n = holder.getLayoutPosition(); mIDeleteBtnClickListener.onDeleteBtnCilck(v, n); } }); } @Override public MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) { View view = LayoutInflater.from(mContext).inflate(R.layout.layout_item, arg0, false); MyViewHolder holder = new MyViewHolder(view); return holder; } public void addData(int position) { mDatas.add(position, "添加项"); notifyItemInserted(position); } public void removeData(int position) { mDatas.remove(position); notifyItemRemoved(position); } /** * 删除菜单打开信息接收 */ @Override public void onMenuIsOpen(View view) { mMenu = (SlidingButtonView) view; } /** * 滑动或者点击了Item监听 * * @param slidingButtonView */ @Override public void onDownOrMove(SlidingButtonView slidingButtonView) { if (menuIsOpen()) { if (mMenu != slidingButtonView) { closeMenu(); } } } /** * 关闭菜单 */ public void closeMenu() { mMenu.closeMenu(); mMenu = null; } /** * 判断是否有菜单打开 */ public Boolean menuIsOpen() { if (mMenu != null) { return true; } return false; } public interface IonSlidingViewClickListener { void onItemClick(View view, int position); void onDeleteBtnCilck(View view, int position); } class MyViewHolder extends RecyclerView.ViewHolder { public TextView btn_Delete; public TextView textView; public ViewGroup layout_content; public MyViewHolder(View itemView) { super(itemView); btn_Delete = (TextView) itemView.findViewById(R.id.tv_delete); textView = (TextView) itemView.findViewById(R.id.text); layout_content = (ViewGroup) itemView.findViewById(R.id.layout_content); ((SlidingButtonView) itemView).setSlidingButtonListener(Adapter.this); } }}
4定义相关的Utils,Utils.java
package com.android.mx.myapplication;import android.content.Context;import android.util.DisplayMetrics;import android.view.WindowManager;public class Utils { //屏幕宽度(像素) 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; }}
5使用效果,MainActivity.java,activity_main.xml
MainActivity.java
package com.android.mx.myapplication;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.DefaultItemAnimator;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.View;public class MainActivity extends AppCompatActivity implements Adapter.IonSlidingViewClickListener { private final String TAG = "test"; private RecyclerView mRecyclerView; private Adapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); setAdapter(); } private void initView() { mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview); } private void setAdapter() { mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setAdapter(mAdapter = new Adapter(this)); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); } @Override public void onItemClick(View view, int position) { Log.i(TAG, "点击项:" + position); } @Override public void onDeleteBtnCilck(View view, int position) { Log.i(TAG, "删除项:" + position); mAdapter.removeData(position); }}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
在build.gradle中应用
compile 'com.android.support:appcompat-v7:22.2.1'compile 'com.android.support:recyclerview-v7:22.2.1'
更多相关文章
- Android菜单实例
- android手电源码
- Android抽屉效果(使用LayoutParams来移动View的位置)
- 在/external/tinyalsa/pcm.c 添加android log
- android 打开微信扫一扫
- Android(安卓)UI开发第五篇——自定义列表
- Android(安卓)Adapter
- Android禁止Menu菜单键长按,(Android菜单形式)
- android.support.v4.widget.DrawerLayout使用