Android mantenga presionado y arrastre hacia arriba y hacia abajo para ordenar, haga clic en el símbolo de eliminar para eliminar

Android mantenga presionado y arrastre hacia arriba y hacia abajo para ordenar, haga clic en el símbolo de eliminar para eliminar

Solo úsalo directamente

Agregue build.gradle en la aplicación dependiente

implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4'//最新版万能适配器

Imagen de dependencia de Settings.gradle en el proyecto más grande

Insertar descripción de la imagen aquí

 maven { url 'https://jitpack.io' }

1. Herramienta clase MyItemTouchHelper

public class MyItemTouchHelper extends ItemTouchHelper.Callback {
    private List<IncomeEntity> list;
    private IncomeAdapter recycleViewAdapter;
    private RequestDouble<Integer, Integer> mRequestResult;
    private int longClickPosition = -1;
    MainActivity activity;

    public MyItemTouchHelper(MainActivity activity, List<IncomeEntity> list, IncomeAdapter recycleViewAdapter, RequestDouble<Integer, Integer> requestResult) {
        Log.d("dddd", "into MyItemTouchHelper");
        this.list = list;
        this.recycleViewAdapter = recycleViewAdapter;
        this.activity = activity;
        this.mRequestResult = requestResult;
    }

    //设置拖拽和item滑动的可支持方向
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        //这里是设置列表水平拖动
        //   final int dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;  //ItemTouchHelper.UP | ItemTouchHelper.DOWN |
        //这里是设置列表是垂直拖动
        final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;  //ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT |

        //这里是设置网格布局拖动
        //   final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;

        final int swipeFlags = 0;
        return makeMovementFlags(dragFlags, swipeFlags);
    }


    /**
     * 拖拽结束后(手指抬起)会回调的方法
     *
     * @param recyclerView
     * @param viewHolder   手指拖拽的item
     * @param target       移动到的item
     * @return
     */
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        // 我们在该方法中实现item数据在数据集合中的位置交换,并调用Adapter的notifyItemMoved完成item界面刷新
        recyclerView.getParent().requestDisallowInterceptTouchEvent(true);
        //得到当拖拽的viewHolder的Position
        int fromPosition = viewHolder.getAdapterPosition();
        //拿到当前拖拽到的item的viewHolder
        int toPosition = target.getAdapterPosition();
        if (fromPosition < toPosition) {
            for (int i = fromPosition; i < toPosition; i++) {
                //这里暂时注释,用外面的数据来进行交换
                //  Collections.swap(list, i, i + 1);
            }
        } else {
            for (int i = fromPosition; i > toPosition; i--) {
                //这里暂时注释,用外面的数据来进行交换
                //  Collections.swap(list, i, i - 1);
            }
        }
        int movementFlags = getMovementFlags(recyclerView, viewHolder);
        Log.d("dddd=============", " movementFlags = " + movementFlags);
        //通知适配器改变位置
        recycleViewAdapter.notifyItemMoved(fromPosition, toPosition);
        Log.d("dddd=============", " fromPosition = " + fromPosition + " toPosition" + toPosition);
        return true;
    }

    /**
     * 侧滑回调
     *
     * @param viewHolder
     * @param direction  方向
     */
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

    }

    /**
     * 长按选中Item时修改颜色
     *
     * @param viewHolder
     * @param actionState
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        //if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
        //viewHolder.itemView.setBackground(getDrawable(R.drawable.card_drag_selected));
        //}
        if (viewHolder != null) {
            longClickPosition = viewHolder.getAdapterPosition();
            Log.d("adapterPosition=====", "adapterPosition22222=" + longClickPosition);
        }

        super.onSelectedChanged(viewHolder, actionState);
    }

    /**
     * 手指松开的时候还原颜色
     *
     * @param recyclerView
     * @param viewHolder
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        int adapterPosition = viewHolder.getAdapterPosition();
        if (mRequestResult != null) {
            //longClickPosition:这是初始索引值            adapterPosition:这是结束索引值
            mRequestResult.result(longClickPosition, adapterPosition);
        }
        Log.d("adapterPosition=====", "adapterPosition=" + adapterPosition);
        super.clearView(recyclerView, viewHolder);
        //viewHolder.itemView.setBackground(getDrawable(R.drawable.card));
    }

    /**
     * 重写拖拽不可用
     *
     * @return
     */
    @Override
    public boolean isLongPressDragEnabled() {
        //开启长按后开始拖拽的效果
        return true;
    }

    public interface RequestDouble<Integer1, Integer2> {
        void result(Integer1 integer1, Integer2 integer2);

    }

}

2 、 entidad. IncomeEntity类

class IncomeEntity {

    var urlImage = ""

    var incomeText = ""

}

3. clase de adaptador IncomeAdapter

public class IncomeAdapter extends BaseQuickAdapter<IncomeEntity, BaseViewHolder> {

    private OnItemClickListener onItemClickListener;//事件回调监听

    public IncomeAdapter(@Nullable List<IncomeEntity> data) {
        super(R.layout.income_item, data);
    }

    @Override
    protected void convert(@NonNull BaseViewHolder helper, IncomeEntity item) {
        int itemPosition = getItemPosition(item);
        helper.setText(R.id.tv_income_title, item.getIncomeText());

        //删除
        helper.getView(R.id.iv_delete).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getData().remove(itemPosition);
                notifyDataSetChanged();
            }
        });

        //变换位置
        helper.getView(R.id.iv_income_sort).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemClickListener.onItemClick(v, itemPosition);
            }
        });

    }

    public interface OnItemClickListener {
        void onItemClick(View view, int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.onItemClickListener = listener;
    }

}

4. fragmento o actividad

private var incomeAdapter: IncomeAdapter? = null
    private val infoList: ArrayList<IncomeEntity> = ArrayList()
    var mItemTouchHelper: ItemTouchHelper? = null

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        //添加数据
        for (i in 0..29) {
            var incomeEntity = IncomeEntity()
            incomeEntity.incomeText = "收入" + i
            infoList.add(incomeEntity)
        }

        var linearLayoutManager = LinearLayoutManager(activity)
        rv_income.layoutManager = linearLayoutManager
        //线
        var dividerItemDecoration = DividerItemDecoration(context, DividerItemDecoration.VERTICAL)
        rv_income.addItemDecoration(dividerItemDecoration)

        incomeAdapter = IncomeAdapter(infoList)
        rv_income.adapter = incomeAdapter

        //适配器点击
        incomeAdapter!!.setOnItemClickListener { view, position ->
            //添加拖拽事件                                                                 longClickPosition:初始索引值            ActionUpPosition:结束索引值
            mItemTouchHelper = ItemTouchHelper(MyItemTouchHelper(MainActivity(),
                infoList,
                incomeAdapter,
                label@ RequestDouble { longClickPosition: Int, ActionUpPosition: Int? ->
                    if (longClickPosition == -1)

                    //用swap方法可以交换集合中任意两个元素的位置
//                    Collections.swap(infoList, longClickPosition, ActionUpPosition!!)

                    //列表的适配器
                        incomeAdapter!!.notifyDataSetChanged()
                }))

            //在这里给列表添加移动顺序
            mItemTouchHelper?.attachToRecyclerView(rv_income)
        }

    }

5. xml correspondiente al adaptador

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="56dp">

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/iv_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="12dp"
        android:src="@drawable/income_delete_item"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/iv_income"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="9dp"
        android:src="@drawable/qq"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/iv_delete"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/tv_income_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="17dp"
        android:text="工资"
        android:textColor="@color/black"
        android:textSize="13sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/iv_income"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/iv_income_sort"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="17dp"
        android:src="@drawable/income_sort_item"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

6. Fragmento o clase de actividad

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_income"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="58dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

ven a mostrar
Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/jiayuanwai/article/details/131052768
Recomendado
Clasificación