Recyclerview条目点击出现侧滑菜单

最近一个奇怪的需求,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,具体问题具体分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。