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
- material design(三)recycleview的ItemTouchHelper
- material design(二)RecycleView的使用详解
- Material Design (三),Snackbar的使用
- Android玩 --- Material Design(1) --- Recycleview的装饰(2)
- android Material Design之 ToolBar+TabLayout+recycleView的效果实现
- RecycleView的使用--material design风格 列表显示
- Material Design动画(三)
- Material Design入门(三)
- Material Design动画(三)
- Android 自定义View(三)Material Design风格的ProgressBar
- Material Design兼容性控件的使用(三)
- Material Design (三) Navigation Drawer的使用
- Material Design控件使用(三)
- Material Design Lite 学习(三) 网格
- Material Design 之Style(三)
- Material Design控件使用(三)
- Material Design(三)
- Material Design学习(三)
- php读取mysql分页查询
- poj 2299 Ultra-QuickSort
- 背景
- 设置JVM内存设置
- 杭州辉为科技HW9X35-GKA主控板
- material design(三)recycleview的ItemTouchHelper
- xtem 指令
- 【NOI2017模拟4.5】数字格
- 【VBA研究】Rnd和Randomize的关系和理解
- 问题 A: 词组缩写
- Java 集合 4:TreeMap 的使用(不包括原理,仅仅是简单的使用 demo)
- 尾递归的概念及作用
- Spring 使用注解方式进行事务管理
- 磁盘不显示且无法更改驱动器号和路径怎么办