RxAndroid+Retrofit+GreenDao+MVP框架---通用基类封装(三)
来源:互联网 发布:mac如何删除照片 编辑:程序博客网 时间:2024/05/22 13:41
打算分为通用的方法,基类封装;网络请求框架封装(RxAndroid+Retrofit);数据库操作封装(GreenDao);
查看完整框架可以到GitHub下载https://github.com/850125665/WeatherApp
RecycleView的长按,单击,drag,swipe封装
-使用现成API可以轻松实现,item的长按,点击,drag,swipe等方法。主要用上GestureDetectorCompat,ItemTouchHelper两个API
TouchListener.java
public class TouchListener implements RecyclerView.OnItemTouchListener {private String TAG = getClass().getSimpleName();private GestureDetectorCompat gestureDetectorCompat;private RecyclerView recyclerView;private OnClickListener onClickListener;private ItemTouchHelper itemTouchHelper;private List list;private RecyclerView.Adapter adapter;private SwipeRefreshLayout swipeRefreshLayout;ViewPager viewPager;public void setOnClickListener(OnClickListener onClickListener) { this.onClickListener = onClickListener;}public TouchListener(RecyclerView recyclerView, final List list, final RecyclerView.Adapter adapter) { this.list = list; this.adapter = adapter; this.recyclerView = recyclerView; gestureDetectorCompat = new GestureDetectorCompat(recyclerView.getContext(), new ItemTouchHelpGestureListener()); List<ViewParent> viewParents = new ArrayList<>(); viewParents = AppMethods.getParentView(recyclerView.getParent(), viewParents); for (ViewParent parent : viewParents) { if (parent instanceof ViewPager) { viewPager = (ViewPager) parent; } else if (parent instanceof SwipeRefreshLayout) { swipeRefreshLayout = (SwipeRefreshLayout) parent; } }}float downX = 0;float downY = 0;@Overridepublic boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { switch (e.getAction()) { case MotionEvent.ACTION_DOWN: downX = e.getX(); downY = e.getY(); if (viewPager != null) { viewPager.requestDisallowInterceptTouchEvent(true); } if (swipeRefreshLayout != null) { swipeRefreshLayout.requestDisallowInterceptTouchEvent(true); } break; case MotionEvent.ACTION_MOVE: if (e.getX() - downX >0) { if (viewPager != null) { viewPager.requestDisallowInterceptTouchEvent(false); } if (swipeRefreshLayout != null) { swipeRefreshLayout.requestDisallowInterceptTouchEvent(false); } }
//
break;
case MotionEvent.ACTION_UP:
if (viewPager != null) {
viewPager.requestDisallowInterceptTouchEvent(false); } if (swipeRefreshLayout != null) { swipeRefreshLayout.requestDisallowInterceptTouchEvent(false); } break; } boolean b = gestureDetectorCompat.onTouchEvent(e); return b;}@Overridepublic void onTouchEvent(RecyclerView rv, MotionEvent e) { gestureDetectorCompat.onTouchEvent(e);}@Overridepublic void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {}public class ItemTouchHelpGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapUp(MotionEvent e) { View childViewUnder = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (childViewUnder != null) { RecyclerView.ViewHolder childViewHolder = recyclerView.getChildViewHolder(childViewUnder); int childLayoutPosition = recyclerView.getChildLayoutPosition(childViewUnder); if (onClickListener != null) { onClickListener.onItemClickListener(childViewHolder, childLayoutPosition); } return false; } return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { LogUtils.d(TAG, "onScroll" + "distanceX" + distanceX + " distanceY" + distanceY); return false; } @Override public void onShowPress(MotionEvent e) { LogUtils.d(TAG, "onShowPress"); } @Override public void onLongPress(MotionEvent e) { View childViewUnder = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (childViewUnder != null) { RecyclerView.ViewHolder childViewHolder = recyclerView.getChildViewHolder(childViewUnder); int childLayoutPosition = recyclerView.getChildLayoutPosition(childViewUnder); if (onClickListener != null) { onClickListener.onItemLongClickListener(childViewHolder, childLayoutPosition); if(swipeRefreshLayout!=null){ swipeRefreshLayout.setEnabled(false); } } } }}public interface OnClickListener { <T extends RecyclerView.ViewHolder> void onItemClickListener(T t, int position); <T extends RecyclerView.ViewHolder> void onItemLongClickListener(T t, int position);}public void dragItem(final SwipeRefreshLayout swipeRefreshLayout, final DragItemListener dragItemListener) { this.swipeRefreshLayout = swipeRefreshLayout; itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { if(swipeRefreshLayout!=null){ swipeRefreshLayout.setEnabled(false); } RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); int dragFlag = 0; int swipeFlag = 0; if (layoutManager instanceof LinearLayoutManager) { dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN; swipeFlag = ItemTouchHelper.START; } else if (layoutManager instanceof GridLayoutManager) { dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.START | ItemTouchHelper.END; } return makeMovementFlags(dragFlag, swipeFlag); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { LogUtils.d(TAG, "onMove"); int from = viewHolder.getAdapterPosition(); int to = target.getAdapterPosition(); if(to<=(list.size()-1) && from<=(list.size()-1)){ list.add(to, list.remove(from)); adapter.notifyItemMoved(from, to); return true; }else{ return false; } } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { int adapterPosition = viewHolder.getAdapterPosition(); if(adapterPosition<=(list.size()-1)){ dragItemListener.swipe(adapterPosition); adapter.notifyItemRemoved(adapterPosition); list.remove(adapterPosition); } LogUtils.d(TAG, "onSwiped"); } @Override public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) { super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y); dragItemListener.drag(); LogUtils.d(TAG, "onMoved"); } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { super.onSelectedChanged(viewHolder, actionState); LogUtils.d(TAG, "onSelectedChanged"); } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); LogUtils.d(TAG, "clearView"); if (swipeRefreshLayout != null) { if (!swipeRefreshLayout.isEnabled()) { AppInfo.getAppInstant().getUiHandler().postDelayed(new TimerTask() { @Override public void run() { swipeRefreshLayout.setEnabled(true); } }, 200); } } } }); itemTouchHelper.attachToRecyclerView(recyclerView);}public interface DragItemListener{ public void drag(); public void swipe(int position);}}
-GestureDetector类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener;SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,它实现了上述两个接口,该类是static class,也就是说它实际上是一个外部类,我们可以在外部继承这个类,重写里面的手势处理方法。因此实现手势识别有两种方法,一种实现OnGestureListener接口,另一种是使用SimpleOnGestureListener类。
OnGestureListener有下面的几个动作:
按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress): 手指按在持续一段时间,并且没有松开。
滚动(onScroll): 手指在触摸屏上滑动。
按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
抬起(onSingleTapUp):手指离开触摸屏的那一刹那。
我们用的SimpleOnGestureListener内部类去实现单击,和长按
public class ItemTouchHelpGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapUp(MotionEvent e) { View childViewUnder = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (childViewUnder != null) { RecyclerView.ViewHolder childViewHolder = recyclerView.getChildViewHolder(childViewUnder); int childLayoutPosition = recyclerView.getChildLayoutPosition(childViewUnder); if (onClickListener != null) { onClickListener.onItemClickListener(childViewHolder, childLayoutPosition); } return false; } return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { LogUtils.d(TAG, "onScroll" + "distanceX" + distanceX + " distanceY" + distanceY); return false; } @Override public void onShowPress(MotionEvent e) { LogUtils.d(TAG, "onShowPress"); } @Override public void onLongPress(MotionEvent e) { View childViewUnder = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (childViewUnder != null) { RecyclerView.ViewHolder childViewHolder = recyclerView.getChildViewHolder(childViewUnder); int childLayoutPosition = recyclerView.getChildLayoutPosition(childViewUnder); if (onClickListener != null) { onClickListener.onItemLongClickListener(childViewHolder, childLayoutPosition); if(swipeRefreshLayout!=null){ swipeRefreshLayout.setEnabled(false); } } } }}
-我们new ItemTouchHelper()来实现drag与swipe
getMovementFlags方法返回的参数是要实现drag还是swipe,我们判断是LinearLayoutManager时只返回drag标识。GridLayoutManager时返回drag与swipe。
onMove方法是drag的实现
onSwiped是swipe的实现
代码简单就不详细讲了
itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { if(swipeRefreshLayout!=null){ swipeRefreshLayout.setEnabled(false); } RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); int dragFlag = 0; int swipeFlag = 0; if (layoutManager instanceof LinearLayoutManager) { dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN; swipeFlag = ItemTouchHelper.START; } else if (layoutManager instanceof GridLayoutManager) { dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.START | ItemTouchHelper.END; } return makeMovementFlags(dragFlag, swipeFlag); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { LogUtils.d(TAG, "onMove"); int from = viewHolder.getAdapterPosition(); int to = target.getAdapterPosition(); if(to<=(list.size()-1) && from<=(list.size()-1)){ list.add(to, list.remove(from)); adapter.notifyItemMoved(from, to); return true; }else{ return false; } } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { int adapterPosition = viewHolder.getAdapterPosition(); if(adapterPosition<=(list.size()-1)){ dragItemListener.swipe(adapterPosition); adapter.notifyItemRemoved(adapterPosition); list.remove(adapterPosition); } LogUtils.d(TAG, "onSwiped"); } @Override public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) { super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y); dragItemListener.drag(); LogUtils.d(TAG, "onMoved"); } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { super.onSelectedChanged(viewHolder, actionState); LogUtils.d(TAG, "onSelectedChanged"); } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); LogUtils.d(TAG, "clearView"); if (swipeRefreshLayout != null) { if (!swipeRefreshLayout.isEnabled()) { AppInfo.getAppInstant().getUiHandler().postDelayed(new TimerTask() { @Override public void run() { swipeRefreshLayout.setEnabled(true); } }, 200); } } } }); itemTouchHelper.attachToRecyclerView(recyclerView);
这个类还做了与viewpage和SwipeRefreshLayout一起用的时候drag和swipe与这两个控件有事件冲突,做了事件冲突处理,主要是在onInterceptTouchEvent方法做处理
@Overridepublic boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { switch (e.getAction()) { case MotionEvent.ACTION_DOWN: downX = e.getX(); downY = e.getY(); if (viewPager != null) { viewPager.requestDisallowInterceptTouchEvent(true); } break; case MotionEvent.ACTION_MOVE: if (e.getX() - downX >0) { if (viewPager != null) { viewPager.requestDisallowInterceptTouchEvent(false); } }
//
break;
case MotionEvent.ACTION_UP:
if (viewPager != null) {
viewPager.requestDisallowInterceptTouchEvent(false); } break; } return gestureDetectorCompat.onTouchEvent(e);}
- RxAndroid+Retrofit+GreenDao+MVP框架---通用基类封装(三)
- RxAndroid+Retrofit+GreenDao+MVP框架---通用基类封装(一)
- RxAndroid+Retrofit+GreenDao+MVP框架---通用基类封装(二)
- 【MVP+retrofit+rxAndroid+dagger2】读易读应用框架笔记(三)完结篇
- 【MVP+Retrofit+RxAndroid+dagger2】读易读应用框架笔记(一)MVP应用篇
- Retrofit+RxAndroid+MVP
- MVP+Retrofit+RxAndroid实例
- 【MVP+Retrofit+RxAndroid+dagger2】读易读应用框架笔记(二)网络请求与回调篇
- MVP+Retrofit+RXAndroid使用详解
- Mvp+Retrofit+RxAndroid基础实例
- 商业级开发框架(MVP+RxJava+Retrofit+GreenDAO)详解
- MVP实战心得(三)---封装Retrofit2.0+RxAndroid+RxBus
- MVP实战心得(三)---封装Retrofit2.0+RxAndroid+RxBus
- MVP实战心得(三)---封装Retrofit2.0+RxAndroid+RxBus
- MVP+Retrofit+fresco+greendao+eventbus
- mvp demo:mvp+rxjava+retrofit(okhttp)+greendao
- Android开源:数据库ORM框架GreenDao学习(三)封装工具类使用
- MVp封装RxJava+Retrofit
- post与get请求中文乱码问题
- javascript——BOM
- ThinkPHP 增删改查操作
- mysql握手连接协议
- ELK搭建(5.1版本)
- RxAndroid+Retrofit+GreenDao+MVP框架---通用基类封装(三)
- 瀑布模型开发与敏捷开发的对比
- 学习Pyqt5(一)
- MySql中的varchar类型
- django auto_now与auto_now_add的区别
- hdu2016校赛1002递增数 dfs搜索
- Zookeeper核心机制
- CSS学习笔记:RGBA与HSLA
- JavaScript 封闭空间