一个简单的自定义RecyclerView适配器(四)——拖拽、滑动

本文介绍了如何在RecyclerView中添加拖拽排序和滑动删除功能。通过继承BaseRecyclerViewAdapter并扩展功能,结合ItemTouchHelper.Callback实现手势操作的监听和UI变化处理。
摘要由CSDN通过智能技术生成

RecyclerView经常需要添加拖拽、滑动删除的功能,这里在前文的基础上,自定义一个适配器

适配器

继承前文的BaseRecyclerViewAdapter,拓展拖拽排序、滑动删除的功能

public abstract class BaseItemRecyclerViewAdapter<T, K extends BaseViewHolder> extends BaseRecyclerViewAdapter<T, K>{

    private int Tag = R.id.BaseQuickAdapter_dragging_support;
    private static final int NO_TOGGLE_VIEW = 0;
    protected int mToggleViewId = NO_TOGGLE_VIEW;
    protected ItemTouchHelper mItemTouchHelper;
    protected boolean itemDragEnabled = false;
    protected boolean itemSwipeEnabled = false;
    protected OnItemDragListener mOnItemDragListener;
    protected OnItemSwipeListener mOnItemSwipeListener;
    protected boolean mDragOnLongPress = true;

    protected View.OnTouchListener mOnToggleViewTouchListener;
    protected View.OnLongClickListener mOnToggleViewLongClickListener;

    private static final String ERROR_NOT_SAME_ITEMTOUCHHELPER = "Item drag and item swipe should pass the same ItemTouchHelper";


    public BaseItemRecyclerViewAdapter(int layoutResId, List<T> data) {
        super(layoutResId, data);
    }


    /**
     * To bind different types of holder and solve different the bind events
     *
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(K holder, int position) {
        super.onBindViewHolder(holder, position);
        int viewType = holder.getItemViewType();

        if (mItemTouchHelper != null && itemDragEnabled) {
            if (mToggleViewId != NO_TOGGLE_VIEW) {
                View toggleView = holder.getView(mToggleViewId);
                if (toggleView != null) {
                    toggleView.setTag(Tag, holder);
                    if (mDragOnLongPress) {
                        toggleView.setOnLongClickListener(mOnToggleViewLongClickListener);
                    } else {
                        toggleView.setOnTouchListener(mOnToggleViewTouchListener);
                    }
                }
            } else {
                holder.itemView.setTag(Tag, holder);
                holder.itemView.setOnLongClickListener(mOnToggleViewLongClickListener);
            }
        }
    }


    /**
     * 设置长按mToggleViewId触发拖动事件
     * 如果未设置mToggleViewId,则在长按item时触发拖动事件
     *
     * @param toggleViewId the toggle view's id
     */
    public void setToggleViewId(int toggleViewId) {
        mToggleViewId = toggleViewId;
    }

    /**
     * 如果为true,则拖动事件将在长按时触发,否则将在点击时触发。
     *
     * @param longPress 默认为true
     */
    public void setToggleDragOnLongPress(boolean longPress) {
        mDragOnLongPress = longPress;
        if (mDragOnLongPress) {
            mOnToggleViewTouchListener = null;
            mOnToggleViewLongClickListener = new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    if (mItemTouchHelper != null && itemDragEnabled) {
                        mItemTouchHelper.startDrag((RecyclerView.ViewHolder) v.getTag(Tag));
                    }
                    return true;
                }
            };
        } else {
            mOnToggleViewTouchListener = new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN
                          
自定义RecyclerView的数据适配器(Adapter)通常涉及到三个关键步骤: 1. **创建ViewHolder**: - ViewHolder是用来复用RecyclerView中的每个item视图的。当新的item添加到列表时,适配器会创建一个新的ViewHolder实例;当滚动删除一个item后,ViewHolder会被标记为可重用。 ```java public class MyViewHolder extends RecyclerView.ViewHolder { public TextView textView; // 或者其他你的视图组件 public MyViewHolder(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); } } ``` 2. **继承RecyclerView.Adapter或其子类**: - 创建一个继承自RecyclerView.Adapter或其子类(如`RecyclerView.Adapter<YourViewHolder>`)的类。这里`YourViewHolder`是你刚才定义的ViewHolder类型。 ```java public class CustomAdapter extends RecyclerView.Adapter<MyViewHolder> { private List<String> dataList; // 你的数据列表 public CustomAdapter(List<String> dataList) { this.dataList = dataList; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout, parent, false); return new MyViewHolder(itemView); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { String item = dataList.get(position); holder.textView.setText(item); // 更新ViewHolder中的视图数据 } @Override public int getItemCount() { return dataList.size(); } } ``` 3. **在Activity/Fragment中设置和管理适配器**: - 在你的主Activity或Fragment中初始化RecyclerView,设置适配器并加载数据。 ```java RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); CustomAdapter adapter = new CustomAdapter(yourDataList); recyclerView.setAdapter(adapter); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值