Recyclerview条目点击出现侧滑菜单

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


Recyclerview条目点击出现侧滑菜单_第1张图片
点击侧滑.gif

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

首先item_list.layout;



    

    
    

        

        
    

    
    

        
    

然后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 {
    View lastView;//最后一次打开的item
    private int slideW;//要展开的按钮宽度
    public boolean isSpread = false;//判断是否又条目已经展开,如果有展开的就等于true,没有展开的就等于false

    public Adapter(@Nullable List 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 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条目点击出现侧滑菜单)