最近一个奇怪的需求,Recyclerview条目点击出现侧滑菜单,侧滑菜单侧滑删除这种需求很常见,轮子也多了去了,开始我并无太在意,做着做着发现不太对,要求不是滑出来的菜单,是点击之后滑动出现的菜单。。。先上成品
思路就是点击按钮的时候给当前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,具体问题具体分析