material design(三)recycleview的ItemTouchHelper

来源:互联网 发布:淘宝运动品牌店铺排名 编辑:程序博客网 时间:2024/05/17 01:05

前言:

上一篇文章,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***  adapterpublic 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
原创粉丝点击