2

こんにちは、ドラッグ アンド ドロップ ビューを作成しようとしていますが、成功しましたが、問題が 1 つあります。このようにビューを動的に追加します。

int k=0;
        for(int i=0;i<badge_list_id.size()/2;i++) {
            Log.i(BaseID.TAG, "K : "+k);
            temp_badge_list_id.clear();
            temp_badge_list_name.clear();
            temp_badge_list_url.clear();
            for(int j=k;j<k+2;j++)
            {
                temp_badge_list_id.add(badge_list_id.get(j));
                temp_badge_list_name.add(badge_list_name.get(j));
                temp_badge_list_url.add(badge_list_url.get(j));
            }
            llContainerBadgeList.addView(new ChildPopUpTopSend(context, temp_badge_list_id, temp_badge_list_name,
                    temp_badge_list_url, badge_id, new callbackDragDrop()));
            k=k+2;
        }

このようにチャイルドビューにオンタッチリスナーを設定します

private View.OnTouchListener mOnTouchDrag1=new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch(event.getAction())
            {
                case MotionEvent.ACTION_MOVE:
                {
                    cbDrag.onDrag(badge_list_id.get(0), badge_id, BaseID.DRAGGING, event, v, badge_list_url.get(0));
                    break;
                }//inner case MOVE
                case MotionEvent.ACTION_UP:
                {
                    cbDrag.onDrag(badge_list_id.get(0), badge_id, BaseID.STOP_DRAG, event, v, badge_list_url.get(0));
                    break;
                }//inner case UP
                case MotionEvent.ACTION_DOWN:
                {
                    cbDrag.onDrag(badge_list_id.get(0), badge_id, BaseID.START_DRAG, event, v, badge_list_url.get(0));
                    break;
                }//inner case UP
            }//inner switch

            return true;
        }
    };

cbDrag.onDrag 関数は次のようになります

private class callbackDragDrop implements callbackDrag {

        @Override
        public void onDrag(int selected_badge, ArrayList<Integer> badge_id, int dragState, 
                MotionEvent event, View v, String badge_url) {
            LinearLayout.LayoutParams par = (LinearLayout.LayoutParams) v.getLayoutParams();
            switch(dragState) {
            case BaseID.START_DRAG:
                llContainerDrag = new LinearLayout(context);
                llContainerDrag.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 
                        (Util.getDisplayHeight(context)*8)/10));
                ivDrag = new ImageView(context);
                imageLoader.DisplayImage(badge_url, ivDrag);
                par.topMargin = (int)event.getRawY() - (int)(v.getHeight()*1.5);
                par.leftMargin = (int)event.getRawX() - (int)(v.getWidth()*1.5);
                ivDrag.setLayoutParams(par);
                llContainerDrag.addView(ivDrag);
                PopUpTopSend.this.addView(llContainerDrag);
                break;
            case BaseID.DRAGGING:
                par.height = drag_height;
                par.width = drag_width;
                par.topMargin = (int)event.getRawY() - (int)(v.getHeight()*1.5);
                par.leftMargin = (int)event.getRawX() - (int)(v.getWidth()*1.5);
                ivDrag.setLayoutParams(par);
                break;
            case BaseID.STOP_DRAG:
                int drop_position = checkDropLocation(event);
                Log.i(BaseID.TAG, "Drop position : "+drop_position);
                ImageView ivDrop;
                switch(drop_position) {
                case 1:
                    if(selected_badge!=badge_id.get(0)) {
                        ivDrop = (ImageView) findViewById(R.id.ivBadgeSend1);
                        imageLoader.DisplayImage(badge_url, ivDrop);
                        PopUpTopSend.this.badge_id.remove(0);
                        PopUpTopSend.this.badge_id.add(0, selected_badge);
                    }
                    break;
                case 2:
                    if(selected_badge!=badge_id.get(1)) {
                        ivDrop = (ImageView) findViewById(R.id.ivBadgeSend2);
                        imageLoader.DisplayImage(badge_url, ivDrop);
                        PopUpTopSend.this.badge_id.remove(1);
                        PopUpTopSend.this.badge_id.add(1, selected_badge);
                    }
                    break;
                case 3:
                    if(selected_badge!=badge_id.get(2)) {
                        ivDrop = (ImageView) findViewById(R.id.ivBadgeSend3);
                        imageLoader.DisplayImage(badge_url, ivDrop);
                        PopUpTopSend.this.badge_id.remove(2);
                        PopUpTopSend.this.badge_id.add(2, selected_badge);
                    }
                    break;
                }
                llContainerDrag.removeView(ivDrag);
                PopUpTopSend.this.removeView(llContainerDrag);
                break;
            }
        }

    }

動的に追加するビューが 8 つあるとします。コードは 1 と 2 から 7 と 8 までのループごとに 2 つのビューを追加しますが、cbDrag.onDrag に渡されるのは常に 7 番目と 8 番目のデータなので、画像をドラッグしようとすると表示されるのは 7 番目と 8 番目の画像ですが、どこが間違っていますか? オンタッチリスナーを設定しようとしているときに、データがループにあるため常に変更されますか?これを解決する方法はありますか?

ありがとうございました

4

0 に答える 0