5

ドラッグ アンド ドロップの GridView を作成しました。最初のドラッグ アンド ドロップを除いて、すべてが完全に機能します。初めてしか起こらない理由がわかりません。

アイテムをグリッドビューの他のアイテムの上に初めてドラッグすると、アイテムのイメージビュー ソースが失われます。ドロップすると、ソースが修正されます..その後、すべてが正常に機能します。これを修正する方法、または奇妙な動作の原因について何か考えはありますか?

ドラッグアンドドロップを処理する私の 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));
}
4

3 に答える 3

1

これがあなたのクエリに関連していることがわかりました。長いコードを理解するのは難しすぎるので、このリンクから管理してみてください。

mGridView.setOnTouchListener(new View.OnTouchListener() ...みたいなことを一度やってみると問題があるかもしれませんmGridView.setOnTouchListener(new OnTouchListener() ...

于 2013-02-09T12:37:08.277 に答える
0

私は最終的に回避策を見つけました。したがって、問題は、DragEvent.ACTION_DRAG_ENTEREDでカラーフィルターを設定すると、ImageViewソースが失われることです。これを避けるために、カラーフィルターを設定するときにソースをリセットします。あまりきれいな解決策ではありませんが、それは私にとってはうまくいきました..すべての助けのためのThnx

于 2013-03-01T14:25:58.723 に答える
0

あなたのコードにはいくつかの問題があると思います:

a. onTouch メソッドは常に false を返します。これは通常、リスナーがまだイベントを消費していないことを意味します。したがって、後でtrueを返す必要があります

target.startDrag(data, new View.DragShadowBuilder(target), target, 0);

b. onDragListener の登録を onTouch イベントの処理メソッドに入れましたが、これがこの問題の主な原因ではないかと思います。ドラッグしたアイテムをドロップするときに、onDragListener が登録されていない可能性があります。リスナーの登録はソース ビューに依存しないため、onDragListener を直接登録できます。コードを次のようにします。

mGridView.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
            ClipData data = ClipData.newPlainText("", "");
            DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            view.startDrag(data, shadowBuilder, view, 0);
            view.setVisibility(View.INVISIBLE);
            return true;
        } else {
            return false;
        }
    }

};

for(View view : ...){
    view.setOnDragListener(new View.OnDragListener() {
        //put your implementation here
    }
}
于 2013-02-11T07:41:55.150 に答える