Android之RecycleView实现指定范围的拖动效果
1问题
在RecycleView里面实现指定位置的拖动效果,(这里是实现线性布局的,不是网格布局的)
@Override publicbooleanonMove(RecyclerViewrecyclerView,RecyclerView.ViewHolderviewHolder,RecyclerView.ViewHoldertarget){ Log.i(TAG,"onMoveviewHolder.getAdapterPosition()is:"+viewHolder.getAdapterPosition()); intitemViewType=viewHolder.getAdapterPosition(); Log.i(TAG,"onMove---------------------------------itemViewTypeis:"+itemViewType); //if(itemViewType==0||itemViewType==1||itemViewType==16){ //Log.i(TAG,"onMove---------------------------------itemViewTypeis:"+itemViewType); //returnfalse; //} intfromPosition=viewHolder.getAdapterPosition();//得到拖动ViewHolder的position inttoPosition=target.getAdapterPosition();//得到目标ViewHolder的position Log.i(TAG,"onMove---------------------------------fromPositionis:"+fromPosition); Log.i(TAG,"onMove---------------------------------toPositionis:"+toPosition); //这里的position如果不是指定范围内的话,直接返回false,就拖动不到其它位置了 if(DragUtil.INSTANCE.getProhibitDragIndexs().contains(toPosition)){ returnfalse; } itemTouchAdapter.onMove(fromPosition,toPosition); returntrue; }
2关键代码如下
MyItemTouchCallback.java
importandroid.graphics.Canvas; importandroid.graphics.Color; importandroid.graphics.drawable.Drawable; importandroid.util.Log; importandroidx.recyclerview.widget.GridLayoutManager; importandroidx.recyclerview.widget.ItemTouchHelper; importandroidx.recyclerview.widget.RecyclerView; importcom.appsinnova.android.keepdrop.manager.FileScanManager; /** *CreatedbyAdministratoron2016/4/12. */ publicclassMyItemTouchCallbackextendsItemTouchHelper.Callback{ publicstaticfinalStringTAG=MyItemTouchCallback.class.getSimpleName(); privateItemTouchAdapteritemTouchAdapter; publicMyItemTouchCallback(ItemTouchAdapteritemTouchAdapter){ this.itemTouchAdapter=itemTouchAdapter; } @Override publicbooleanisLongPressDragEnabled(){ returnfalse; } @Override publicbooleanisItemViewSwipeEnabled(){ returntrue; } @Override publicintgetMovementFlags(RecyclerViewrecyclerView,RecyclerView.ViewHolderviewHolder){ Log.i(TAG,"getMovementFlagsviewHolder.getAdapterPosition()is:"+viewHolder.getAdapterPosition()); intitemViewType=viewHolder.getAdapterPosition(); Log.i(TAG,"---------------------------------itemViewTypeis:"+itemViewType); //if(itemViewType==0||itemViewType==1||itemViewType==16){ //Log.i(TAG,"-getMovementFlags--------------------------------itemViewTypeis:"+itemViewType); //returnmakeMovementFlags(0,0); //} if(recyclerView.getLayoutManager()instanceofGridLayoutManager){ finalintdragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT; finalintswipeFlags=0; returnmakeMovementFlags(dragFlags,swipeFlags); }else{ finalintdragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN; //finalintswipeFlags=ItemTouchHelper.START|ItemTouchHelper.END; finalintswipeFlags=0; Log.i(TAG,"makeMovementFlagsstart"); returnmakeMovementFlags(dragFlags,swipeFlags); } } @Override publicbooleanonMove(RecyclerViewrecyclerView,RecyclerView.ViewHolderviewHolder,RecyclerView.ViewHoldertarget){ Log.i(TAG,"onMoveviewHolder.getAdapterPosition()is:"+viewHolder.getAdapterPosition()); intitemViewType=viewHolder.getAdapterPosition(); Log.i(TAG,"onMove---------------------------------itemViewTypeis:"+itemViewType); //if(itemViewType==0||itemViewType==1||itemViewType==16){ //Log.i(TAG,"onMove---------------------------------itemViewTypeis:"+itemViewType); //returnfalse; //} intfromPosition=viewHolder.getAdapterPosition();//得到拖动ViewHolder的position inttoPosition=target.getAdapterPosition();//得到目标ViewHolder的position Log.i(TAG,"onMove---------------------------------fromPositionis:"+fromPosition); Log.i(TAG,"onMove---------------------------------toPositionis:"+toPosition); //这里的position如果不是指定范围内的话,直接返回false,就拖动不到其它位置了 if(DragUtil.INSTANCE.getProhibitDragIndexs().contains(toPosition)){ returnfalse; } itemTouchAdapter.onMove(fromPosition,toPosition); returntrue; } @Override publicvoidonSwiped(RecyclerView.ViewHolderviewHolder,intdirection){ intposition=viewHolder.getAdapterPosition(); itemTouchAdapter.onSwiped(position); } @Override publicvoidonChildDraw(Canvasc,RecyclerViewrecyclerView,RecyclerView.ViewHolderviewHolder,floatdX,floatdY,intactionState,booleanisCurrentlyActive){ if(actionState==ItemTouchHelper.ACTION_STATE_SWIPE){ //滑动时改变Item的透明度 finalfloatalpha=1-Math.abs(dX)/(float)viewHolder.itemView.getWidth(); viewHolder.itemView.setAlpha(alpha); viewHolder.itemView.setTranslationX(dX); }else{ super.onChildDraw(c,recyclerView,viewHolder,dX,dY,actionState,isCurrentlyActive); } } @Override publicvoidonSelectedChanged(RecyclerView.ViewHolderviewHolder,intactionState){ if(actionState!=ItemTouchHelper.ACTION_STATE_IDLE){ if(background==null&&bkcolor==-1){ Drawabledrawable=viewHolder.itemView.getBackground(); if(drawable==null){ bkcolor=0; }else{ background=drawable; } } viewHolder.itemView.setBackgroundColor(Color.LTGRAY); } super.onSelectedChanged(viewHolder,actionState); } @Override publicvoidclearView(RecyclerViewrecyclerView,RecyclerView.ViewHolderviewHolder){ super.clearView(recyclerView,viewHolder); viewHolder.itemView.setAlpha(1.0f); if(background!=null)viewHolder.itemView.setBackgroundDrawable(background); if(bkcolor!=-1)viewHolder.itemView.setBackgroundColor(bkcolor); //viewHolder.itemView.setBackgroundColor(0); if(onDragListener!=null){ onDragListener.onFinishDrag(); } } privateDrawablebackground=null; privateintbkcolor=-1; privateOnDragListeneronDragListener; publicMyItemTouchCallbacksetOnDragListener(OnDragListeneronDragListener){ this.onDragListener=onDragListener; returnthis; } publicinterfaceOnDragListener{ voidonFinishDrag(); } publicinterfaceItemTouchAdapter{ voidonMove(intfromPosition,inttoPosition); voidonSwiped(intposition); } }
OnRecyclerItemClickListener.java
importandroid.view.GestureDetector; importandroid.view.MotionEvent; importandroid.view.View; importandroidx.core.view.GestureDetectorCompat; importandroidx.recyclerview.widget.RecyclerView; /** *CreatedbyAdministratoron2016/4/14. */ publicclassOnRecyclerItemClickListenerimplementsRecyclerView.OnItemTouchListener{ privateGestureDetectorCompatmGestureDetector; privateRecyclerViewrecyclerView; publicOnRecyclerItemClickListener(RecyclerViewrecyclerView){ this.recyclerView=recyclerView; mGestureDetector=newGestureDetectorCompat(recyclerView.getContext(),newItemTouchHelperGestureListener()); } @Override publicbooleanonInterceptTouchEvent(RecyclerViewrv,MotionEvente){ mGestureDetector.onTouchEvent(e); returnfalse; } @Override publicvoidonTouchEvent(RecyclerViewrv,MotionEvente){ mGestureDetector.onTouchEvent(e); } @Override publicvoidonRequestDisallowInterceptTouchEvent(booleandisallowIntercept){ } privateclassItemTouchHelperGestureListenerextendsGestureDetector.SimpleOnGestureListener{ @Override publicbooleanonSingleTapUp(MotionEvente){ Viewchild=recyclerView.findChildViewUnder(e.getX(),e.getY()); if(child!=null){ RecyclerView.ViewHoldervh=recyclerView.getChildViewHolder(child); onItemClick(vh); } returntrue; } @Override publicvoidonLongPress(MotionEvente){ Viewchild=recyclerView.findChildViewUnder(e.getX(),e.getY()); if(child!=null){ RecyclerView.ViewHoldervh=recyclerView.getChildViewHolder(child); onLongClick(vh); } } } publicvoidonLongClick(RecyclerView.ViewHoldervh){} publicvoidonItemClick(RecyclerView.ViewHoldervh){} }
适配器里面实现接口
MyItemTouchCallback.ItemTouchAdapter
importandroid.text.TextUtils; importandroid.util.Log; importandroid.view.View; importandroid.widget.ImageView; importorg.greenrobot.eventbus.EventBus; importjava.util.ArrayList; importjava.util.Collections; importjava.util.List; importstaticcom.appsinnova.android.keepdrop.recommend.entity.ChannelHead.channelType; publicclassChannelManagerAdapterextendsBaseMultiItemQuickAdapterimplementsMyItemTouchCallback.ItemTouchAdapter{ publicstaticfinalStringTAG=ChannelManagerAdapter.class.getSimpleName(); publicstaticfinalintMY_VEDIO_TYPE=0; publicstaticfinalintMORE_VEDIO_TYPE=1; publicstaticfinalintCAN_EDITABLE=1; publicstaticfinalintCAN_NOT_EDITABLE=0; publicList results=null; publicChannelManagerAdapter(List data){ super(data); addItemType(ChannelHead.channelHeadType,R.layout.item_channel_head); addItemType(channelType,R.layout.item_channel); this.results=data; } @Override protectedvoidconvert(BaseViewHolderhelper,MultiItemEntityitem){ switch(helper.getItemViewType()){ } } @Override publicvoidonMove(intfromPosition,inttoPosition){ if(fromPosition==results.size()-1||toPosition==results.size()-1){ return; } if(fromPosition toPosition;i--){ Collections.swap(results,i,i-1); } } //这个数据是移动后的数据,会更新原始数据 intsize=results.size(); List items=newArrayList (); RecommendVedioModelrecommendVedioModel=SPHelper.getInstance().getObject(SpConstants.RECOMMEND_VEDIO_CATETGORY,RecommendVedioModel.class); for(inti=0;i 然后在页面显示的地方
channelManagerAdapter=ChannelManagerAdapter(allDatas) vallayoutManager=LinearLayoutManager(this) layoutManager.orientation=LinearLayoutManager.VERTICAL channelRecycleview.setLayoutManager(layoutManager) channelRecycleview.setAdapter(channelManagerAdapter) valitemTouchHelper=ItemTouchHelper(MyItemTouchCallback(channelManagerAdapter)) itemTouchHelper.attachToRecyclerView(channelRecycleview) channelRecycleview.addOnItemTouchListener(object:OnRecyclerItemClickListener(channelRecycleview){ overridefunonLongClick(vh:RecyclerView.ViewHolder){ LogUtil.i(TAG,"onLongClickvh.layoutPositionis:"+vh.layoutPosition) varindex=vh.layoutPosition if(!prohibitDragIndexs.contains(index)){ itemTouchHelper.startDrag(vh) } } })到此这篇关于Android之RecycleView实现指定范围的拖动效果的文章就介绍到这了,更多相关androidrecycleView实现指定范围的拖动内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!