实现RecyclerView中item条目上下交换位置和左滑删除

2019-05-04  本文已影响0人  清风兑酒
移动条目
1、TouchCallBack接口
public interface TouchCallBack {
    //交换条目位置
    void onItemMove(int fromPosition,int toPosition);
    //删除条目
    void onItemDelete(int position);
}
2、SimpleItemTouchCallBack类
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;

public class SimpleItemTouchCallBack extends ItemTouchHelper.Callback{

    private TouchCallBack mCallBack;
    //左滑删除的
    private boolean mSwipeEnable = true;

    public SimpleItemTouchCallBack(TouchCallBack mCallBack) {
        this.mCallBack = mCallBack;
    }

    /**
     * 返回可以滑动的方向,一般使用makeMovementFlags(int,int)
     * 或makeFlag(int, int)来构造我们的返回值
     * @param recyclerView
     * @param viewHolder
     * @return
     */
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {

        //允许上下拖拽
        int drag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        //允许向左滑动
        int swipe = ItemTouchHelper.LEFT;
        //设置
        return makeMovementFlags(drag,swipe);
    }

    /**
     * 上下拖动item时回调,可以调用Adapter的notifyItemMoved方法来交换两个ViewHolder的位置,
     * 最后返回true,
     * 表示被拖动的ViewHolder已经移动到了目的位置
     * @param recyclerView
     * @param viewHolder
     * @param target
     * @return
     */
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        //通知适配器,两个子条目位置发生改变
        mCallBack.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
        return true;
    }

    /**
     * 当用户左右滑动item时达到删除条件就会调用,一般为一半,条目继续滑动删除,否则弹回
     * @param viewHolder
     * @param direction
     */
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        mCallBack.onItemDelete(viewHolder.getAdapterPosition());
    }

    /**
     * 支持长按拖动,默认是true
     * @return
     */
    @Override
    public boolean isLongPressDragEnabled() {
        return super.isLongPressDragEnabled();
    }

    /**
     * 支持滑动,即可以调用到onSwiped()方法,默认是true
     * @return
     */
    @Override
    public boolean isItemViewSwipeEnabled() {
        return mSwipeEnable;
    }

    /**
     * 设置是否支持左滑删除
     * @param enable
     */
    public void setmSwipeEnable(boolean enable) {
        this.mSwipeEnable = enable;
    }
}
3.在Activity中
/**
 * homeSpecialRecyclerViewAdapter  RecyclerView 的适配器
 * recyclerview                    RecyclerView 控件
*/
// 拖拽移动和左滑删除
SimpleItemTouchCallBack simpleItemTouchCallBack = new SimpleItemTouchCallBack(homeSpecialRecyclerViewAdapter);
// 要实现侧滑删除条目,把 false 改成 true 就可以了
simpleItemTouchCallBack.setmSwipeEnable(false);
ItemTouchHelper helper = new ItemTouchHelper(simpleItemTouchCallBack);
helper.attachToRecyclerView(recyclerview);
4、使 RecyclerView 的适配器实现 TouchCallBack 接口
/**
* goldTitleBeans 适配器里的数据集合
*/
@Override
public void onItemMove(int fromPosition, int toPosition) {
    //交换集合中两个数据的位置
    Collections.swap(goldTitleBeans,fromPosition,toPosition);
    //刷新界面,局部刷新,索引会混乱
    notifyItemMoved(fromPosition,toPosition);
}

@Override
public void onItemDelete(int position) {
    goldTitleBeans.remove(position);
    //局部刷新,索引会混乱+集合越界
    notifyItemRemoved(position);
}
上一篇下一篇

猜你喜欢

热点阅读