material design(三)recycleview的ItemTouchHelper

前言:

上一篇文章,material design(二)RecycleView的使用详解,简单介绍了recycleview的使用,并且实现了item的点击和长按事件效果。Android提供了一个ItemTouchHelper类,顾名思义,这完全就是为了服务item的类。下面我们来通过这个类来实现item的滑动删除和拖拽实现位置交换的效果。

使用:

1 继承ItemTouchHelper.Callback

public class RecycleItemTouchHelper extends ItemTouchHelper.Callback {

    private ListViewAdapter mAdapter;

    public RecycleItemTouchHelper(ListViewAdapter madapter) {

        this.mAdapter=madapter;
    }

    /**
     * 设置滑动类型标记
     * @param recyclerView
     * @param viewHolder
     * @return 返回一个整数类型的标识,用于判断Item那种移动行为是允许的
     */
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        /**
         * START  右向左
         * END  左向右
         * LEFT  向左
         * RIGHT 向右
         * UP  向上
         * 如果某个值传0,表示不触发该操作,次数设置支持上下拖拽,支持向右滑动
         */

        return makeMovementFlags(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.END|ItemTouchHelper.START);
    }

    /**
     * 拖拽切换item的回调
     * @param recyclerView
     * @param viewHolder
     * @param target
     * @return true切换了拖拽  false 没有切换
     */
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        mAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
        return true;
    }

    /**
     * 滑动的回调
     * @param viewHolder
     * @param direction
     */
    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

      mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
    }

    /**
     * 是否支持长按拖拽
     * @return
     */
    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    /**
     * item是否支持滑动
     * @return
     */
    @Override
    public boolean isItemViewSwipeEnabled() {
        return true;
    }

    /**
     * 恢复到原状态,没有消失
     * @param recyclerView
     * @param viewHolder
     */
    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);
        Log.i("sssssssss1","11111");
    }

    /**
     *
     * @param viewHolder
     * @param actionState 0正在侧滑 1释放
     */
    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        super.onSelectedChanged(viewHolder, actionState);
        Log.i("sssssssss2","22222"+actionState);
        if (actionState!= ItemTouchHelper.ACTION_STATE_IDLE){
            viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
        }
    }

    /**
     * item滑动
     * @param c
     * @param recyclerView
     * @param viewHolder
     * @param dX
     * @param dY
     * @param actionState
     * @param isCurrentlyActive
     */
    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
        Log.i("sssssssss3","3333"+isCurrentlyActive);
    }

    /**
     * 滑动停止
     * @param c
     * @param recyclerView
     * @param viewHolder
     * @param dX
     * @param dY
     * @param actionState
     * @param isCurrentlyActive
     */
    @Override
    public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
        Log.i("sssssssss4","4444"+dY);
    }
}
代码还是比较简单的,首先传一个adapter进来,主要是为了回调事件。
getMovementFlags  滑动类型标记

onMove 拖拽交换事件

onSwiped 滑动删除事件

其他事件也都有注释,可以看看自己点击看看log日志。

***2***  adapter
public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.ViewHolder> implements ItemTouchHelperAdapter {

    private Context mContext;
    private List<ListBean> mData=new ArrayList<>();
    private LayoutInflater inflater;

    public List<ListBean> getData() {
        return mData;
    }

    public void setData(List<ListBean> data) {
        mData = data;
        notifyDataSetChanged();
    }

    public void addData(List<ListBean> data){
        mData.addAll(data);
        notifyDataSetChanged();
    }

    /**
     * 复用item布局
     * @param parent Recycleview
     * @param viewType type类型
     * @return 内部类viewhodler对象
     */

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(mContext==null){
            mContext=parent.getContext();
            inflater=LayoutInflater.from(mContext);
        }
        View view= inflater.inflate(R.layout.listview_item,parent,false);
        Log.i("sssss1",parent.toString()+"    "+viewType);
        return new ListViewAdapter.ViewHolder(view);
    }

    /**
     *
     * @param holder onCreateViewHolder返回的holder
     * @param position 位置
     */
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        Log.i("sssss2",holder.toString()+"    "+position);
        ListBean bean=mData.get(position);
        holder.mTextView.setText(bean.getName());
//        holder.mTextView.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                addData(position);
//            }
//        });
//        holder.mTextView.setOnLongClickListener(new View.OnLongClickListener() {
//            @Override
//            public boolean onLongClick(View v) {
//                removeData(position);
//                return false;
//            }
//        });

    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

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

    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        Collections.swap(mData, fromPosition, toPosition);
        notifyItemMoved(fromPosition, toPosition);
    }

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

    /**
     * ViewHolder的内部类,View为item的布局,其他小的控件
     * 可以findviewbyid获得,这个view就是textview
     */
    static class ViewHolder extends RecyclerView.ViewHolder{
        private TextView mTextView;
        public ViewHolder(View itemView) {
            super(itemView);
            mTextView= (TextView) itemView.findViewById(R.id.tv_item);
        }
    }
    public void addData(int position) {
        mData.add(position, new ListBean("Insert One"));
        notifyItemInserted(position);
    }

    public void removeData(int position) {
        mData.remove(position);
        notifyItemRemoved(position);
    }
}

主要是事件的监听,同时要主要数据更新通知调用的方法,这样才有动画。

3 监听接口 ItemTouchHelperAdapter

public interface ItemTouchHelperAdapter {

    //交换
    void onItemMove(int fromPosition, int toPosition);

    //滑动删除
    void onItemDismiss(int position);

}

4 activity

 //-------------item---------------------------
        ItemTouchHelper.Callback helper=new RecycleItemTouchHelper(mListViewAdapter);
        ItemTouchHelper touchHelper=new ItemTouchHelper(helper);
        touchHelper.attachToRecyclerView(mRecyclerView);

设置callback到recycleview中,这样就能实现item的数据交换和滑动删除了,是不是很简单。欢迎留言交流。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值