こんにちは、ドラッグ アンド ドロップ ビューを作成しようとしていますが、成功しましたが、問題が 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 番目の画像ですが、どこが間違っていますか? オンタッチリスナーを設定しようとしているときに、データがループにあるため常に変更されますか?これを解決する方法はありますか?
ありがとうございました