material design(三)recycleview的ItemTouchHelper
2017-04-10 10:57
225 查看
前言:
上一篇文章,material design(二)RecycleView的使用详解,简单介绍了recycleview的使用,并且实现了item的点击和长按事件效果。Android提供了一个ItemTouchHelper类,顾名思义,这完全就是为了服务item的类。下面我们来通过这个类来实现item的滑动删除和拖拽实现位置交换的效果。使用:
1 继承ItemTouchHelper.Callbackpublic 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的数据交换和滑动删除了,是不是很简单。欢迎留言交流。。。。
相关文章推荐
- android之RecycleView之ItemTouchHelper 处理拖拽、滑动删除
- android---RecycleView使用ItemTouchHelper实现拖拽和侧滑删除
- RecycleView ItemTouchHelper 学习(一)
- Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
- RecyclerView进阶:使用ItemTouchHelper实现拖拽和侧滑删除
- RecyclerView之使用ItemTouchHelper和ItemTouchHelper.Callback实现条目拖拽排序
- Android ItemTouchHelper实现RecyclerView交互动画
- RecyclerView的item拖动排序效果实现和它的ItemTouchHelper详解
- Android RecyclerView 使用 ItemTouchHelper 时异常
- android开发游记:ItemTouchHelper 使用RecyclerView打造可拖拽的GridView
- Android学习之ItemTouchHelper实现RecylerView的拖拽以及滑动删除功能
- 从源码来看ItemTouchHelper实现RecyclerView列表的拖拽和侧滑
- Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
- RecyclerView打造可拖拽的GridView使用ItemTouchHelper
- RecyclerView使用ItemTouchHelper实现拖拽和侧滑删除
- 利用 ItemTouchHelper 实现 RecyclerView 的侧滑删除
- RecyclerView长按拖动效果,用ItemTouchHelper实现
- Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
- Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
- Android使用ItemTouchHelper打造可拖拽的RecyclerView