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,具体问题具体分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351