参考资料:Android 精彩编程200例

1. 实现过程
- 在Gradle Scripts添加 recyclerview 的依赖
implementation 'com.android.support:recyclerview-v7:27.1.1'
- getScreeWith()获取手机屏幕宽度
public static int getScreeWith(Context context){ // 获取窗口管理服务 WindowManager ww = (WindowManager) >context.getSystemService(Context.WINDOW_SERVICE); // 屏幕参数对象 DisplayMetrics displayMetrics = new DisplayMetrics(); // 获取屏幕参数 ww.getDefaultDisplay().getMetrics(displayMetrics); // 返回屏幕宽度 return displayMetrics.widthPixels; }
- 创建 SlidingButtonView.java 类,用于实现自定义滑动“删除”按钮控件
public class SlidingButton extends HorizontalScrollView {
private TextView textView,ts;//删除按钮
private int IScrollWid;//横向滚动
private Boolean first = false; //标记第一次获取按钮
private double fx = 0.0;
public SlidingButton(Context context) {
super(context,null );
}
public SlidingButton(Context context, AttributeSet attrs) {
super(context, attrs,0);
}
public SlidingButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.setOverScrollMode(OVER_SCROLL_NEVER); //设置滚动模式
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//第一次进入时获取删除按钮控件
textView = findViewById(R.id.bt_delete);
ts = findViewById(R.id.textview);
first = true; //修改标记
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
// 默认隐藏删除按钮
if(changed){
this.scrollTo(0,0);
// 获取水平滚动条的范围
IScrollWid = textView.getWidth();
Log.d("SlidingButton", "onLayout: "+ts.getWidth());
}
}
// 收拾判断
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_UP: //手指抬起
changScrollx(Math.abs(ev.getX() - fx));
break;
case MotionEvent.ACTION_DOWN:// 手指按下
fx = ev.getX();
Log.d("SlidingButton", "onTouchEvent: "+fx);
break;
}
return super.onTouchEvent(ev);
}
//判断是否显示删除按钮
private void changScrollx(double route) {
// 触摸滑动的距离大于删除按钮宽度一半
if( route >= (IScrollWid)){
//显示删除按钮
//scrollTo(IScrollWid,0);
this.post(new Runnable() {//弹性滑动
@Override
public void run() {
smoothScrollTo(IScrollWid, 0);
}
});
}else{
//scrollTo(0,0);
// 实现弹性滑动需要在handler中进行
this.post(new Runnable() {
@Override
public void run() {
smoothScrollTo(0, 0);
}
});
}
}
}
- recyclerview 的 Adapter
public class Aadapter extends RecyclerView.Adapter<Aadapter.ViewHolder> {
private Context context;
private List<String> listString = new ArrayList<>();
public Aadapter(Context context, List<String> list){
this.context = context;
listString = list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout, parent, false);
ViewHolder mViewH = new ViewHolder(view);
return mViewH;
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
holder.viewGroup.getLayoutParams().width = Utils.getScreeWith(context);
// 删除按钮单击事件
holder.btn_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int n = holder.getLayoutPosition(); //获取行位置
removeDate(n); //删除指定的行
}
});
}
@Override
public int getItemCount() {
return listString.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private ViewGroup viewGroup;
private TextView btn_delete;
public ViewHolder(View itemView) {
super(itemView);
btn_delete = itemView.findViewById(R.id.bt_delete);
viewGroup = itemView.findViewById(R.id.layout_content);
}
}
// 删除列表行中信息的方法
public void removeDate(int position){
listString.remove(position); //删除列表信息
notifyItemRemoved(position); //删除行
}
- item_layout
<com.example.q9163.myandroid.view.SlidingButton xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="1dp"
android:background="#ffffff">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/layout_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical">
<ImageView
android:id="@+id/img"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/img"
android:text="asdasdasasdas" />
</RelativeLayout>
<TextView
android:id="@+id/bt_delete"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="#123654"
android:layout_toRightOf="@+id/layout_content"
android:text="删除" />
</RelativeLayout>
</com.example.q9163.myandroid.view.SlidingButton>
2. 结果:

注意:
smoothScrollTo()
: 有时候调用smoothScrollTo方法布局不会滚动,而scrollTo却可以,但我们又想要一种平滑的效果,可通过上述代码简单解决- 测量过程中需要注意
padding
。android:overScrollMode="never"
去掉滚动条和滑动到边界阴影
网友评论