RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能

RecyclerView是官方推荐取代ListView的空间,如何实现RecyclerView列表元素的拖动呢?

官方提供了ItemTouchHelper类使用步骤如下:

  • 定义ItemTouchHelper.Callback实现类,以下是几个重要的方法

package com.zms.copyapp.helper;

import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log;

/**
 * Created by Msn on 2015/7/28.
 */
public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback{

    private ItemTouchListener mItemTouchListener;

    public MyItemTouchHelperCallback(ItemTouchListener itemTouchListener){
        mItemTouchListener = itemTouchListener;
    }

    /**
     * 支持长按进入拖动
     * @return
     */
    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    @Override
    public boolean isItemViewSwipeEnabled() {
        return false;
    }

    /**
     * 指定拖动和滑动支持的方向
     * @param recyclerView
     * @param viewHolder
     * @return
     */
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    //List部分功能
//        int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//拖动支持向下和向上
//        int swipeFlag = ItemTouchHelper.START | ItemTouchHelper.END;//滑动支持向左和向右
        //Grid部分功能
        int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN |ItemTouchHelper.START | ItemTouchHelper.END;
        int swipeFlag = 0;
        return makeMovementFlags(dragFlag,swipeFlag);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
        Log.e("Test","onMove--------------------------------");
        mItemTouchListener.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        Log.e("Test", "onSwiped--------------------------------");
        mItemTouchListener.onItemDismiss(viewHolder.getAdapterPosition());
    }

    /**
     * 在每次View Holder的状态变成拖拽 (ACTION_STATE_DRAG) 或者 滑动 (ACTION_STATE_SWIPE)的时候被调用。
     * @param viewHolder
     * @param actionState
     */
    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        if(actionState != ItemTouchHelper.ACTION_STATE_IDLE){
            ItemStatusListener listener = (ItemStatusListener)viewHolder;
            listener.onItemSelected();
        }
        super.onSelectedChanged(viewHolder, actionState);
    }

    /**
     * 在一个view被拖拽然后被放开的时候被调用,
     * @param recyclerView
     * @param viewHolder
     */
    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);
        ItemStatusListener listener = (ItemStatusListener)viewHolder;
        listener.onItemClear();
    }
}

  • 声明ItemTouchHelper,并绑定到待管理的RecyclerView上
 ItemTouchHelper.Callback helperCallback = new MyItemTouchHelperCallback(adapter);
        helper = new ItemTouchHelper(helperCallback);
        helper.attachToRecyclerView(recyclerView);


 

  • 在Adapter中定义滑动删除和拖动排序的数据逻辑
package com.zms.copyapp;

import android.graphics.Color;
import android.support.v4.view.MotionEventCompat;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.zms.copyapp.helper.ItemStatusListener;
import com.zms.copyapp.helper.ItemTouchListener;

import org.w3c.dom.Text;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by Msn on 2015/7/28.
 */
public class MyRecyclerListAdapter extends RecyclerView.Adapter<MyRecyclerListAdapter.MyViewHolder>
            implements ItemTouchListener{
    public final static String[] STR_ARRAY = {"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGTH","NINE","TEN"};
    private final List<String> mItems = new ArrayList<>();

    private OnDragListener dragListener;

    public MyRecyclerListAdapter(OnDragListener listener) {
        mItems.addAll((Arrays.asList(STR_ARRAY)));
        dragListener = listener;
    }

    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        String prev = mItems.remove(fromPosition);
        mItems.add(toPosition > fromPosition ? toPosition - 1 : toPosition, prev);
        notifyItemMoved(fromPosition,toPosition);
    }

    @Override
    public void onItemDismiss(int position) {
        mItems.remove(position);
        notifyItemRemoved(position);
    }



    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main,parent,false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        holder.textView.setText(mItems.get(position));
        holder.handleImgv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if(MotionEventCompat.getActionMasked(motionEvent)
                        == MotionEvent.ACTION_DOWN){
                    dragListener.onStartDrag(holder);
                    Log.e("Test","onTouch.ACTION_DOWN");
                }
                return false;
            }
        });
    }

    @Override
    public int getItemCount() {
        return mItems.size();
    }

    public  class MyViewHolder extends RecyclerView.ViewHolder implements ItemStatusListener{
        public ImageView handleImgv;
        public TextView textView;
        public MyViewHolder(View view){
            super(view);
            textView = (TextView)view.findViewById(R.id.text);
            handleImgv = (ImageView)view.findViewById(R.id.handle);
        }

        @Override
        public void onItemSelected() {
            itemView.setBackgroundColor(Color.LTGRAY);
        }

        @Override
        public void onItemClear() {
            itemView.setBackgroundColor(Color.TRANSPARENT);
        }
    }


    public interface OnDragListener{
        public void onStartDrag(MyViewHolder holder);
        public void onStartSwipe(MyViewHolder holder);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RecyclerViewItemTouchHelper是一个强大的辅助工具类,用于处理RecyclerView中Item的触摸操作和拖拽操作。如果想要让部分Item的位置固定,可以通过以下步骤实现: 1. 首先,创建一个自定义的ItemTouchHelper.Callback类,继承自ItemTouchHelper.Callback。在该类中重写以下几个方法: - getMovementFlags()方法:返回Item的拖拽和滑动方向,可以根据具体需求对各个Item设置不同的拖拽和滑动方向。 - onMove()方法:处理Item的拖拽操作,可以在此方法中完成Item位置的交换。在交换时,需要判断被拖拽的Item是否是固定位置的Item,如果是,则不进行交换操作。 - onSwiped()方法:处理Item的滑动操作,可以在此方法中完成Item的滑动删除操作。同样在滑动删除时,需要判断被滑动的Item是否是固定位置的Item,如果是,则不进行删除操作。 2. 在RecyclerView的Adapter中,重写以下几个方法: - onBindViewHolder()方法:在该方法中为每个Item添加触摸事件的监听器,只有非固定位置的Item才可以进行触摸操作。 3. 在MainActivity或其他适当的地方,创建ItemTouchHelper对象,并将自定义的ItemTouchHelper.Callback类传入。 - ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new CustomItemTouchHelperCallback()); 4. 将ItemTouchHelper对象与RecyclerView进行绑定。 - itemTouchHelper.attachToRecyclerView(recyclerView); 通过以上步骤的实现,可以实现RecyclerView中部分Item固定位置的效果。在进行拖拽或滑动操作时,会自动跳过固定位置的Item,并保持其固定位置不变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫叶思念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值