117.Android 简单的拖拽列表+防止越界拖动(BaseRecyclerViewAdapterHelper) 两种方式实现

news/2024/7/16 10:27:26 标签: android, android studio, ide

 //一.第一种方式 通过BaseItemDraggableAdapter类和其提供的的拖拽监听实现:

//1.第一步 导入依赖库和权限:

//依赖库:

//RecyclerView
implementation 'com.android.support:recyclerview-v7:28.0.0'

//RecyclerAdapter
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28'

//用到的权限:

<!--振动-->
<uses-permission android:name="android.permission.VIBRATE" />

 //2.第二步 新建ItemDraggableActivity页面:

//manifest注册:

<activity
    android:name=".phone.activity.ItemDraggableActivity"
    android:launchMode="singleTop"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateHidden"
    tools:ignore="LockedOrientationActivity" />

//activity代码:

/**
 * @author CJF
 */
public class ItemDraggableActivity extends AppCompatActivity implements BaseQuickAdapter.OnItemChildClickListener, View.OnClickListener {
    private final GridLayoutManager manager = new GridLayoutManager(this, 3);
    private final ItemDraggableAdapter adapter = new ItemDraggableAdapter(R.layout.item_draggable_item, new ArrayList<>());

    /**
     * 震动时长(毫秒)
     */
    private final int milliseconds = 50;
    private Vibrator vibrator;
    private RecyclerView mTreeListRecy;
    private TextView mEdit;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tree_list);

        //点击音效
        vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        mTreeListRecy = findViewById(R.id.mTreeListRecy);
        mEdit = findViewById(R.id.mEdit);
        mEdit.setOnClickListener(this);

        mTreeListRecy.setLayoutManager(manager);
        mTreeListRecy.setAdapter(adapter);

        DragAndSwipeCallback itemDragAndSwipeCallback = new DragAndSwipeCallback(adapter);
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);
        itemTouchHelper.attachToRecyclerView(mTreeListRecy);
        //可以不用设置,可以拖拽的方向,默认上下左右
        itemDragAndSwipeCallback.setDragMoveFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);

//         开启拖拽 设置可拖拽item的根布局id
        adapter.enableDragItem(itemTouchHelper, R.id.mItemDraggableItemLin, true);
        adapter.setOnItemDragListener(onItemDragListener);


        // 开启滑动删除
//        adapter.enableSwipeItem();
//        adapter.setOnItemSwipeListener(onItemSwipeListener);

        adapter.setOnItemChildClickListener(this);

        List<ItemDraggableBean> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            ItemDraggableBean bean = new ItemDraggableBean();
            bean.setName("数据" + i);
            list.add(bean);
        }
        adapter.addData(list);
    }

    /**
     * 拖拽监听
     */
    private OnItemDragListener onItemDragListener = new OnItemDragListener() {
        @Override
        public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos) {
            Log.e("TAG1231", "onItemDragStart" + "你在拖拽第" + (pos + 1) + "个位置的item哦!");
            //震动
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                vibrator.vibrate(VibrationEffect.createOneShot(milliseconds, VibrationEffect.DEFAULT_AMPLITUDE));
            } else {
                vibrator.vibrate(milliseconds);
            }

            //按住变大
            viewHolder.itemView.setScaleX(1.2f);
            viewHolder.itemView.setScaleY(1.2f);
            viewHolder.itemView.setAlpha(0.5f);

            //改变数据状态
            ItemDraggableBean draggableBean = adapter.getData().get(pos);
            if (!draggableBean.isShow()) {
                List<ItemDraggableBean> data = adapter.getData();
                for (ItemDraggableBean bean : data) {
                    bean.setShow(true);
                }

                //循环遍历出所有的item布局 并显示图片
                //注意不可以直接使用 adapter.notifyDataSetChanged();数据刷新会导致直接调用onItemDragEnd()方法
                for (int i = 0; i < mTreeListRecy.getChildCount(); i++) {
                    View childAt = mTreeListRecy.getChildAt(i);
                    TextView textView = childAt.findViewById(R.id.mItemDraggableItemText);
                    View view = childAt.findViewById(R.id.mItemDraggableItemImg);
                    view.setVisibility(View.VISIBLE);
                    Log.e("TAG1231", "textView:" + textView.getText().toString());
                }

                mEdit.setText("完成");
            }

        }

        @Override
        public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {
            Log.e("TAG1231", "onItemDragMoving");
        }

        @Override
        public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {
            Log.e("TAG1231", "onItemDragEnd" + "拖拽到了第" + (pos + 1) + "个位置哦!");
            //变回原来大小
            viewHolder.itemView.setScaleX(1.0f);
            viewHolder.itemView.setScaleY(1.0f);
            viewHolder.itemView.setAlpha(1.0f);
        }
    };

    OnItemSwipeListener onItemSwipeListener = new OnItemSwipeListener() {
        @Override
        public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos) {
            ToastUtil.getInstance().showToast("继续向左滑动即可删除第" + (pos + 1) + "个位置的item");
        }

        @Override
        public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {

        }

        @Override
        public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {
            ToastUtil.getInstance().showToast("删除了第" + (pos + 1) + "个位置的item哦");
        }

        @Override
        public void onItemSwipeMoving(Canvas canvas, RecyclerView.ViewHolder viewHolder, float dX, float dY, boolean isCurrentlyActive) {

        }
    };

    @Override
    public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
        adapter.remove(position);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.mEdit:
                boolean isEdit = "编辑".equals(mEdit.getText().toString());
                List<ItemDraggableBean> data = adapter.getData();
                for (ItemDraggableBean bean : data) {
                    bean.setShow(isEdit);
                }
                adapter.notifyDataSetChanged();
                mEdit.setText(isEdit ? "完成" : "编辑");
                break;
            default:
                break;
        }
    }

}

//3.第三步 新建DragAndSwipeCallback类继承ItemDragAndSwipeCallback,重写onChildDraw 防止越界拖动:

/**
 * @author CJF
 * 重写onChildDraw 防止越界拖动
 */
public class DragAndSwipeCallback extends ItemDragAndSwipeCallback {

    public DragAndSwipeCallback(BaseItemDraggableAdapter adapter) {
        super(adapter);
    }

    /**
     * 重写onChildDraw 防止越界拖动
     *
     * @param c
     * @param recyclerView
     * @param viewHolder
     * @param dX
     * @param dY
     * @param actionState
     * @param isCurrentlyActive
     */
    @Override
    public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        float topY = viewHolder.itemView.getTop() + dY;
        float bottomY = topY + viewHolder.itemView.getHeight();

        float leftX = viewHolder.itemView.getLeft() + dX;
        float rightX = leftX + viewHolder.itemView.getWidth();

        if (topY < 0) {
            dY = 0;
        } else if (bottomY > recyclerView.getHeight()) {
            dY = recyclerView.getHeight() - viewHolder.itemView.getHeight() - viewHolder.itemView.getTop();
        }

        if (leftX < 0) {
            dX = viewHolder.itemView.getWidth() - viewHolder.itemView.getRight();
        } else if (rightX > recyclerView.getWidth()) {
            dX = recyclerView.getWidth() - viewHolder.itemView.getWidth() - viewHolder.itemView.getLeft();
        }

        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }

}

//4.第四步 新建ItemDraggableAdapter适配器类:

/**
 * @author CJF
 */
public class ItemDraggableAdapter extends BaseItemDraggableAdapter<ItemDraggableBean, BaseViewHolder> {

    public ItemDraggableAdapter(List<ItemDraggableBean> data) {
        super(data);
    }

    public ItemDraggableAdapter(int layoutResId, List<ItemDraggableBean> data) {
        super(layoutResId, data);

    }

    @Override
    protected void convert(BaseViewHolder helper, ItemDraggableBean item) {
        helper.setText(R.id.mItemDraggableItemText, item.getName());
        helper.setGone(R.id.mItemDraggableItemImg, item.isShow());
        helper.addOnClickListener(R.id.mItemDraggableItemImg);
    }

}

//5.第五步 新建ItemDraggableBean类:

/**
 * @author CJF
 */
public class ItemDraggableBean {
    private String name;
    private boolean isShow = false;

    public ItemDraggableBean() {
    }

    public ItemDraggableBean(String name, boolean isShow) {
        this.name = name;
        this.isShow = isShow;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isShow() {
        return isShow;
    }

    public void setShow(boolean show) {
        isShow = show;
    }

}

//6.第六步 各个xml布局文件以及svg图片文件:

//activity_tree_list:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@color/color_white"
    android:orientation="vertical">

    <TextView
        android:id="@+id/mEdit"
        android:background="@drawable/selector_common_item"
        android:textColor="@color/colorAccent"
        android:textStyle="bold"
        android:textSize="18sp"
        android:gravity="center"
        android:text="编辑"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/mTreeListRecy"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

//item_draggable_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_search"
    android:layout_margin="@dimen/dp_5"
    android:id="@+id/mItemDraggableItemLin"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/mItemDraggableItemText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="left|center_vertical"
        android:minHeight="@dimen/dp_50"
        android:padding="@dimen/dp_10"
        android:text="text"
        android:textColor="@color/black"
        android:textSize="@dimen/sp_15" />

    <ImageView
        android:scaleType="center"
        android:id="@+id/mItemDraggableItemImg"
        android:src="@drawable/crm_close"
        android:layout_width="@dimen/dp_50"
        android:layout_height="match_parent"/>

</LinearLayout>

//svg图片文件  crm_close:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
</vector>

//二.第二种方式 通过继承ItemTouchHelper.Callback类重写几个方法实现:

//1.第一步 导入依赖库:

//RecyclerView
implementation 'com.android.support:recyclerview-v7:28.0.0'

//RecyclerAdapter
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28'

//2.第二步 新建ItemDraggableActivity页面:

//manifest注册:

<activity
    android:name=".phone.activity.ItemDraggableActivity"
    android:launchMode="singleTop"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateHidden"
    tools:ignore="LockedOrientationActivity" />

//activity代码:

/**
 * @author CJF
 */
public class ItemDraggableActivity extends AppCompatActivity implements BaseQuickAdapter.OnItemChildClickListener, BaseQuickAdapter.OnItemLongClickListener {
    private final GridLayoutManager manager = new GridLayoutManager(this, 3);
    private final ItemDraggableAdapter adapter = new ItemDraggableAdapter(R.layout.item_draggable_item);

    private RecyclerView mTreeListRecy;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tree_list);

        mTreeListRecy = findViewById(R.id.mTreeListRecy);

        mTreeListRecy.setLayoutManager(manager);
        mTreeListRecy.setAdapter(adapter);

        adapter.setOnItemChildClickListener(this);
        adapter.setOnItemLongClickListener(this);

        //列表上下左右拖拽滑动
        AdapterTouchHelper adapterTouchHelper = new AdapterTouchHelper(mTreeListRecy, adapter);


        List<ItemDraggableBean> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            ItemDraggableBean bean = new ItemDraggableBean();
            bean.setName("数据" + i);
            list.add(bean);
        }
        adapter.addData(list);

    }


    @Override
    public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
        adapter.remove(position);
    }

    @Override
    public boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
        //改变数据状态
        ItemDraggableBean draggableBean = (ItemDraggableBean) adapter.getData().get(position);
        if (!draggableBean.isShow()) {
            List<ItemDraggableBean> data = adapter.getData();
            for (ItemDraggableBean bean : data) {
                bean.setShow(true);
            }

            //循环遍历出所有的item布局 并显示图片
            //注意不可以直接使用 adapter.notifyDataSetChanged();数据刷新会导致直接结束滑动
            for (int i = 0; i < mTreeListRecy.getChildCount(); i++) {
                View childAt = mTreeListRecy.getChildAt(i);
                TextView textView = childAt.findViewById(R.id.mItemDraggableItemText);
                View mItemDraggableItemImg = childAt.findViewById(R.id.mItemDraggableItemImg);
                mItemDraggableItemImg.setVisibility(View.VISIBLE);
                Log.e("TAG1231", "textView:" + textView.getText().toString());
            }

        }
        return false;
    }

}

//3.第三步 新建ItemDraggableAdapter适配器:

/**
 * @author CJF
 */
public class ItemDraggableAdapter extends BaseQuickAdapter<ItemDraggableBean, BaseViewHolder> {

    public ItemDraggableAdapter(int layoutResId) {
        super(layoutResId);
    }

    @Override
    protected void convert(BaseViewHolder helper, ItemDraggableBean item) {
        helper.setText(R.id.mItemDraggableItemText, item.getName());
        helper.setGone(R.id.mItemDraggableItemImg, item.isShow());
        helper.addOnClickListener(R.id.mItemDraggableItemImg);
    }

}

//4.第四步 新建AdapterTouchHelper类继承ItemTouchHelper.Callback实现核心功能:

/**
 * @author CJF
 * 列表上下左右拖拽滑动
 */
public class AdapterTouchHelper extends ItemTouchHelper.Callback {
    private BaseQuickAdapter adapter;

    public AdapterTouchHelper(RecyclerView recyclerView, BaseQuickAdapter adapter) {
        this.adapter = adapter;
        //用Callback构造ItemtouchHelper
        ItemTouchHelper touchHelper = new ItemTouchHelper(this);
        //调用ItemTouchHelper的attachToRecyclerView方法建立联系
        touchHelper.attachToRecyclerView(recyclerView);
    }

    @Override
    public int getMovementFlags(@NotNull RecyclerView recyclerView, @NotNull RecyclerView.ViewHolder viewHolder) {
        //允许上下拖动
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        return makeMovementFlags(dragFlags, 0);
    }

    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    /**
     * Item进行上下移动从旧的位置到新的位置的时候会调用该方法
     *
     * @param recyclerView
     * @param viewHolder   旧位置
     * @param target       目标位置
     * @return
     */
    @Override
    public boolean onMove(@NotNull RecyclerView recyclerView, @NotNull RecyclerView.ViewHolder viewHolder, @NotNull RecyclerView.ViewHolder target) {
        //交换位置
        Collections.swap(adapter.getData(), viewHolder.getAdapterPosition(), target.getAdapterPosition());
        adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    /**
     * Item左右移动达到条件时时,会调用该方法
     *
     * @param viewHolder
     * @param direction
     */
    @Override
    public void onSwiped(@NotNull RecyclerView.ViewHolder viewHolder, int direction) {

    }

    /**
     * 重写onChildDraw 防止越界拖动
     *
     * @param c
     * @param recyclerView
     * @param viewHolder
     * @param dX
     * @param dY
     * @param actionState
     * @param isCurrentlyActive
     */
    @Override
    public void onChildDraw(@NotNull Canvas c, @NotNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        float topY = viewHolder.itemView.getTop() + dY;
        float bottomY = topY + viewHolder.itemView.getHeight();

        float leftX = viewHolder.itemView.getLeft() + dX;
        float rightX = leftX + viewHolder.itemView.getWidth();

        if (topY < 0) {
            dY = 0;
        } else if (bottomY > recyclerView.getHeight()) {
            dY = recyclerView.getHeight() - viewHolder.itemView.getHeight() - viewHolder.itemView.getTop();
        }

        if (leftX < 0) {
            dX = viewHolder.itemView.getWidth() - viewHolder.itemView.getRight();
        } else if (rightX > recyclerView.getWidth()) {
            dX = recyclerView.getWidth() - viewHolder.itemView.getWidth() - viewHolder.itemView.getLeft();
        }

        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }

    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {

        //开始按住滑动
        if (actionState == ItemTouchHelper.ACTION_STATE_DRAG && !isViewCreateByAdapter(viewHolder)) {
            //按住变大
            viewHolder.itemView.setScaleX(1.2f);
            viewHolder.itemView.setScaleY(1.2f);
            viewHolder.itemView.setAlpha(0.5f);
        }
        super.onSelectedChanged(viewHolder, actionState);
    }

    @Override
    public void clearView(@NotNull RecyclerView recyclerView, @NotNull RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);
        if (isViewCreateByAdapter(viewHolder)) {
            return;
        }

        //结束按住滑动 变回原来大小
        viewHolder.itemView.setScaleX(1.0f);
        viewHolder.itemView.setScaleY(1.0f);
        viewHolder.itemView.setAlpha(1.0f);
    }

    private boolean isViewCreateByAdapter(RecyclerView.ViewHolder viewHolder) {
        int type = viewHolder.getItemViewType();
        return type == BaseQuickAdapter.HEADER_VIEW || type == BaseQuickAdapter.LOADING_VIEW
                || type == BaseQuickAdapter.FOOTER_VIEW || type == BaseQuickAdapter.EMPTY_VIEW;
    }

}

//5.第五步 新建ItemDraggableBean类:

/**
 * @author CJF
 */
public class ItemDraggableBean {
    private String name;
    private boolean isShow = false;

    public ItemDraggableBean() {
    }

    public ItemDraggableBean(String name, boolean isShow) {
        this.name = name;
        this.isShow = isShow;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isShow() {
        return isShow;
    }

    public void setShow(boolean show) {
        isShow = show;
    }

}

//6.第六步 各个xml布局以及svg图片:

//activity_tree_list:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@color/color_white"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/mTreeListRecy"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

//item_draggable_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_search"
    android:layout_margin="@dimen/dp_5"
    android:id="@+id/mItemDraggableItemLin"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/mItemDraggableItemText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="left|center_vertical"
        android:minHeight="@dimen/dp_50"
        android:padding="@dimen/dp_10"
        android:text="text"
        android:textColor="@color/black"
        android:textSize="@dimen/sp_15" />

    <ImageView
        android:scaleType="center"
        android:id="@+id/mItemDraggableItemImg"
        android:src="@drawable/crm_close"
        android:layout_width="@dimen/dp_50"
        android:layout_height="match_parent"/>

</LinearLayout>

//svg图片 crm_close:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
</vector>

//------------------------------------------------------END---------------------------------------------------------------


http://www.niftyadmin.cn/n/95531.html

相关文章

Linux——UDP协议与相关套接字编程

一.概念在网络通信中&#xff0c;传输层中最常用的通信协议有两个&#xff1a;TCP协议与UDP协议。这两种协议虽然都可以用于网络通信&#xff0c;但是通信方式不同决定了应用场景的不同。与TCP协议相比&#xff0c;UDP协议最具特色的不同点有两个&#xff1a;无连接与面向数据报…

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

目录 一. 大致如下常见问题&#xff1a; &#xff08;1&#xff09;找不到程序所依赖的Qt库 version Qt_5 not found (required by &#xff08;2&#xff09;Could not Load the Qt platform plugin "xcb" in "" even though it was found &#xff0…

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day14

大家好&#xff0c;我是陶然同学&#xff0c;软件工程大三今年实习。认识我的朋友们知道&#xff0c;我是科班出身&#xff0c;学的还行&#xff0c;但是对面试掌握不够&#xff0c;所以我将用这100多天更新Java面试题&#x1f643;&#x1f643;。 不敢苟同&#xff0c;相信大…

2023面试必备:web自动化测试POM设计模式详解

1.背景 为UI页面写自动化测试用例时&#xff08;如&#xff1a;web自动化、app自动化&#xff09;&#xff0c;使用普通的线性代码&#xff0c;测试用例中会存在大量的元素定位及操作细节&#xff0c;当UI界面变化时&#xff0c;测试用例也要跟着变化&#xff0c;在自动化测试…

vuecli引入vue-amap地图组件(高德地图SDK)

指南&#xff1a;组件 | vue-amap 1、前往高德开放平台注册开发者账号&#xff0c;在控制台申请Key 高德开放平台&#xff1a;高德开放平台 | 高德地图API申请Key&#xff1a;获取Key-创建工程-开发指南-Web服务 API | 高德地图API 2、安装vue-amap npm install vue-amap --…

校招Java岗位面经(一面)

面试题是Guide哥那里找的&#xff0c;我帮大家找来答案并且整理了一下。大家背八股文可以去看Guide哥的。JavaGuide&#xff08;Java学习&&面试指南&#xff09; | JavaGuide(Java面试学习指南)这是携程的Java一面。&#x1f4e3;一面45min题目&#xff1a;进程和线程的…

超纯水制备,MB-106UP抛光树脂的技术解析

超纯水&#xff08;Ultrapure water&#xff09;又称UP水&#xff0c;是指电阻率达到18 MΩ*cm&#xff08;25℃&#xff09;的水。这种水中除了水分子外&#xff0c;几乎没有什么杂质&#xff0c;更没有细菌、病毒、含氯二噁英等有机物&#xff0c;当然也没有人体所需的矿物质…

数学小课堂:数列和级数(要知道当下很重要,但趋势更重要。)

文章目录 引言I 数列1.1 斐波那契数列1.2 等差数列1.3 等比数列(几何数列)1.4 级数(数列的求和)1.5 学习数学的技巧II 数列和数字的关系2.1 斐波那契数列的增长速率2.2 碳-14测定法(等比数列的应用)2.3 数列的意义引言 通过学习一些数学知识和方法,帮助我形成了系统的做事…