首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android RecyclerView 拖拽闪烁问题?

Android RecyclerView 拖拽闪烁问题?

提问于 2024-05-23 21:04:10
回答 0关注 1查看 14

我用RecyclerVIew实现一个宫格样式,中间一项itemtype不同作为标题分割,添加了拖拽ItemTouchHelper,但是当我拖拽越过中间的标题时,标题前后的item移动动画变成淡入淡出,并且标题会闪烁一下。请问是为什么?

当上方元素拖动到下方,第2屏标题闪烁
当上方元素拖动到下方,第2屏标题闪烁
代码语言:txt
复制
public class MyItemTouchHelper extends ItemTouchHelper.Callback{
        private List<MenuInfo> pictureBeans;
        private ModuleAdapter recycleViewAdapter;
        Activity activity;
        public MyItemTouchHelper(Activity activity, List<MenuInfo> pictureBeans, ModuleAdapter recycleViewAdapter) {
            Log.d("dddd","into MyItemTouchHelper");
            this.pictureBeans = pictureBeans;
            this.recycleViewAdapter = recycleViewAdapter;
            this.activity = activity;
        }

        private boolean canSwipe(RecyclerView.ViewHolder viewHolder){
            if(viewHolder instanceof ViewHolderSplite){
                return false;
            }else{
                return true;
            }
        }

        @Override
        public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
            if(canSwipe(viewHolder)){
                final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
                final int swipeFlags = 0;
                return makeMovementFlags(dragFlags, swipeFlags);
            }else{
                return makeMovementFlags(0, 0);
            }
        }

        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            if(target instanceof ViewHolderSplite){
                return false;
            }
            recyclerView.getParent().requestDisallowInterceptTouchEvent(true);
            //得到当拖拽的viewHolder的Position
            int fromPosition = viewHolder.getAdapterPosition();
            //拿到当前拖拽到的item的viewHolder
            int toPosition = target.getAdapterPosition();

            if (fromPosition < toPosition) {
                //从前面到后面
                for (int i = fromPosition; i < toPosition; i++) {
                    if(isHeader(i + 1)){//如果与标题替换,跳过
                        Collections.swap(pictureBeans, i, i + 2);
                        i++;
                    }else{
                        Collections.swap(pictureBeans, i, i + 1);
                    }
                }
            } else {
                //从后面到前面
                for (int i = fromPosition; i > toPosition; i--) {
                    if(isHeader(i - 1)){//如果与标题替换,跳过
                        Collections.swap(pictureBeans, i, i - 2);
                        i--;
                    }else{
                        Collections.swap(pictureBeans, i, i - 1);
                    }
                }
            }

            // 通知Adapter数据项已移动
            recycleViewAdapter.notifyItemMoved(fromPosition, toPosition);

            Log.d("dddd"," fromPosition = "+fromPosition+" toPosition"+toPosition);
            return true;
        }

        private boolean isHeader(int index){
            if(pictureBeans.get(index).itemType == MenuInfo.ITEM_TYPE_SPLITE){
                return true;
            }
            return false;
        }



        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

        }

        /**
         * 长按选中Item时修改颜色
         *
         * @param viewHolder
         * @param actionState
         */
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
            //if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
            //viewHolder.itemView.setBackground(getDrawable(R.drawable.card_drag_selected));
            //}
            super.onSelectedChanged(viewHolder, actionState);
        }

        /**
         * 手指松开的时候还原颜色
         * @param recyclerView
         * @param viewHolder
         */
        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            super.clearView(recyclerView, viewHolder);
            //viewHolder.itemView.setBackground(getDrawable(R.drawable.card));
        }
    }

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档