美文网首页
Recyclerview条目点击出现侧滑菜单

Recyclerview条目点击出现侧滑菜单

作者: 莫不如哦 | 来源:发表于2020-09-29 11:23 被阅读0次

    最近一个奇怪的需求,Recyclerview条目点击出现侧滑菜单,侧滑菜单侧滑删除这种需求很常见,轮子也多了去了,开始我并无太在意,做着做着发现不太对,要求不是滑出来的菜单,是点击之后滑动出现的菜单。。。先上成品


    点击侧滑.gif

    思路就是点击按钮的时候给当前item设置一个属性动画平移一个侧滑菜单的宽度,然后保存下最后侧滑过的那个item,在点击别的item或者recyclerview滑动的时候在给最后展开过的那个item设置一个关闭的属性动画平移回去,思路很简单,代码也很简单。不多解释,扔代码

    首先item_list.layout;

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/ll_main"
        android:layout_width="525dp"
        android:layout_height="100dp"
        android:layout_marginTop="20dp"
        android:orientation="horizontal">
        <!--   这个item的宽度 等于你ui图的宽度+上侧滑按钮的宽度 写固定宽度 不能用match或者wrap
    怕出现适配问题,就动态去算,动态去取值,或者用今日头条的那个屏幕适配一步到位,写死值就可以了 
      -->
    
        <!--    这个主要展示内容的宽度 等于你ui图的宽度-->
        <RelativeLayout
            android:id="@+id/rl_content"
            android:layout_width="375dp"
            android:layout_height="match_parent"
            android:background="#303">
    
            <ImageView
                android:id="@+id/iv"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:src="@mipmap/ic_launcher" />
    
            <TextView
                android:id="@+id/text"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_toRightOf="@+id/iv"
                android:text="11111111111"
                android:textSize="18sp" />
        </RelativeLayout>
    
        <!--    这个主侧滑按钮的宽度 等于你删除按钮的宽度-->
        <LinearLayout
            android:id="@+id/ll_slide"
            android:layout_width="150dp"
            android:layout_height="match_parent"
            android:layout_marginLeft="-10dp"
            android:background="#000000"
            android:orientation="horizontal">
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_toRightOf="@+id/iv"
                android:gravity="center"
                android:text="删除"
                android:textColor="#ffffff"
                android:textSize="18sp" />
        </LinearLayout>
    </LinearLayout>
    

    然后adapter的代码

    import android.animation.ObjectAnimator;
    import android.view.View;
    import com.chad.library.adapter.base.BaseQuickAdapter;
    import com.chad.library.adapter.base.viewholder.BaseViewHolder;
    import org.jetbrains.annotations.NotNull;
    import org.jetbrains.annotations.Nullable;
    import java.util.List;
    
    /**
     * author:gkq
     * date:2020/9/2
     */
    public class Adapter extends BaseQuickAdapter<String, BaseViewHolder> {
        View lastView;//最后一次打开的item
        private int slideW;//要展开的按钮宽度
        public boolean isSpread = false;//判断是否又条目已经展开,如果有展开的就等于true,没有展开的就等于false
    
        public Adapter(@Nullable List<String> data) {
            super(R.layout.item_test, data);
        }
    
        @Override
        protected void convert(@NotNull BaseViewHolder helper, String s) {
    //        addChildClickViewIds(R.id.iv);
            helper.setText(R.id.text, s);
            View ll_main = helper.getView(R.id.ll_main);
            View ll_slide = helper.getView(R.id.ll_slide);
    
            helper.getView(R.id.iv).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    //                if (isSpread) {//有展开的时候关闭展开的
    //                    close();
    //                } else {//没有展开view的时候再展开当前view
    //                    open(ll_slide, ll_main);
    //                }
    
    
                    //也可以写成展开的同时去关闭之前的
                    if (isSpread) {//有展开的时候关闭展开的
                        close();
                    } //没有展开view的时候再展开当前view
                    open(ll_slide, ll_main);
    
                }
            });
            ll_slide.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //这是adapter自带的删除条目的方法
                    removeAt(helper.getLayoutPosition());
                }
            });
        }
    
        private void open(View ll_slide, View ll_main) {
            isSpread = true;
            slideW = ll_slide.getWidth();
            lastView = ll_main;
            ObjectAnimator animator = ObjectAnimator.ofFloat(lastView, "translationX",
                    0, -slideW);
            animator.setDuration(100);
            animator.start();
        }
    
    
        /**
         * 这个方法在你需要的操作列表的时候调用,比如其他按钮的点击事件,列表滑动的时候,其他按钮的长按事件这些用到了的话就要先调用这个
         */
        public void close() {
            try {
                isSpread = false;
                ObjectAnimator animator = ObjectAnimator.ofFloat(lastView, "translationX",
                        -slideW, 0);
                animator.setDuration(100);
                animator.start();
            } catch (Exception e) {
    
            }
        }
    
    }
    
    

    adapter我是用的BRVAH的万能适配器 地址是这个 http://www.recyclerview.org/
    当然你手写adapter也是不影响的

    然后是activity的代码

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    import com.chad.library.adapter.base.BaseQuickAdapter;
    import com.chad.library.adapter.base.listener.OnItemClickListener;
    import java.util.ArrayList;
    
    /**
     * author:gkq
     * date:2020/9/2
     */
    public class ListActivity extends Activity {
    
    
        private RecyclerView rlv;
        private Adapter adapter;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_list);
            initView();
        }
    
    
        protected void initView() {
            rlv = findViewById(R.id.rlv);
            rlv.setLayoutManager(new LinearLayoutManager(this));
            ArrayList<String> data = new ArrayList<>();
            for (int i = 0; i < 20; i++) {
                data.add(i + "条目啊啊啊啊啊啊啊");
            }
    
            adapter = new Adapter(data);
            rlv.setAdapter(adapter);
            adapter.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(@NonNull BaseQuickAdapter<?, ?> a, @NonNull View view, int position) {
                    if (adapter.isSpread) {
                        //点击其他item的时候,如果有条目展开了 就关闭
                        adapter.close();
                    }
                }
            });
            rlv.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                    if (adapter.isSpread) {
                        adapter.close();
                    }
                    super.onScrollStateChanged(recyclerView, newState);
                }
            });
    
        }
    }
    

    以上只是简单思路的实现,实际使用过程中,预计会有一些bug,具体问题具体分析

    相关文章

      网友评论

          本文标题:Recyclerview条目点击出现侧滑菜单

          本文链接:https://www.haomeiwen.com/subject/akteuktx.html