android - 第一次在 GridView 中拖放时缺少 ImageView 源

标签 android gridview drag-and-drop

我拖放了 GridView。除了第一次拖放之外,一切都完美无缺。我找不到它只在第一次发生的原因。

我第一次将一个项目拖到 gridview 中的其他项目上时,项目的 imageview 源丢失了。当我放下它时,源将被修复。之后一切都会正常工作。知道我该如何解决这个问题或奇怪行为的原因吗?

这是我的 touchListener,它将处理拖放操作:

mGridView.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                GridView parent = (GridView) v;

                int x = (int) event.getX();
                int y = (int) event.getY();

                int position = parent.pointToPosition(x, y);
                if (position > AdapterView.INVALID_POSITION) {

                    int count = parent.getChildCount();
                    for (int i = 0; i < count; i++) {
                        View curr = parent.getChildAt(i);
                        curr.setOnDragListener(new View.OnDragListener() {

                            @Override
                            public boolean onDrag(View v, DragEvent event) {

                                boolean result = true;
                                int action = event.getAction();
                                switch (action) {
                                case DragEvent.ACTION_DRAG_STARTED:
                                    break;
                                case DragEvent.ACTION_DRAG_LOCATION:
                                    break;
                                case DragEvent.ACTION_DRAG_ENTERED:    
                                    setBlueFilterOnImageView((ImageView) v, getActivity());
                                    break;
                                case DragEvent.ACTION_DRAG_EXITED:
                                    clearColorFilterOnImageView((ImageView) v);
                                    break;
                                case DragEvent.ACTION_DROP:

                                    if (event.getLocalState() == v) {
                                        result = false;
                                    } else {
                                        
                                        View droped = (View) event.getLocalState();

                                        View target = v;
                                        
                                        app.myProfile().removeProfilePhotoAtIndex(((DragGridItemHolder) droped.getTag()).position);
                                        app.myProfile().insertProfilePhoto(((DragGridItemHolder) droped.getTag()).id, ((DragGridItemHolder) target.getTag()).position);
                                        
                                        
                                        mAdapter.notifyDataSetChanged();
                                
                                    }
                                    break;
                                case DragEvent.ACTION_DRAG_ENDED:
                                    clearColorFilterOnImageView((ImageView) v);     
                                    break;
                                default:
                                    result = false;
                                    break;
                                }
                                return result;
                            }
                        });
                    }

                    int relativePosition = position - parent.getFirstVisiblePosition();


                    View target = (View) parent.getChildAt(relativePosition);
                    
                    DragGridItemHolder holder = (DragGridItemHolder) target.getTag();
                    String text = holder.id;
                    ClipData data = ClipData.newPlainText("DragData", text);
                    target.startDrag(data, new View.DragShadowBuilder(target), target, 0);
                }
            }
            return false;
        }
    });

编辑

public static void setBlueFilterOnImageView(ImageView imageView, Context context){
    PorterDuffColorFilter blueFilter = new PorterDuffColorFilter(
            context.getResources().getColor(R.color.grid_state_focused),
            PorterDuff.Mode.SRC_ATOP);
    imageView.setColorFilter(blueFilter);
    imageView.setBackgroundColor(context.getResources().getColor(
            R.color.grid_state_pressed));
}

最佳答案

我找到了 this与您的查询相关的可能会对您有所帮助。很难理解您的长代码,因此请尝试通过此链接进行管理。

可能是 mGridView.setOnTouchListener(new View.OnTouchListener() ... 中的问题一旦尝试像 mGridView.setOnTouchListener(new OnTouchListener() ...

关于android - 第一次在 GridView 中拖放时缺少 ImageView 源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14643367/

相关文章:

Android - 使用 postDelayed() 调用定期运行方法

android - GridView 行高行为不正确

gridview - flutter - 在 gridview 上换行时如何设置宽度?

ios - 参数类型 'customClass.Type' 不符合预期类型 'NSItemProviderWriting'

Android Java 项目在 Android Studio 中转换为 Kotlin

java - 传递包含两个整数的对象或不同的方法?

android - 抽屉导航重叠在 ActionBar 导航选项卡内容上

java - GridView.minHeight 不适用于小项目数

javascript - 使用 Dropzone.js 的非 ajax 帖子

asp.net - 网格选择禁用/不可见