0
我正在使用自定義行和自定義適配器進行列表視圖。我已將OnTouchListener和OnDragListener附加到列表視圖中的每個視圖。Android OnDragListener - ACTION_DRAG_ENDED多次觸發
我更新的基礎數據如果下拉結果爲真(被拖動的視圖列表視圖的範圍內下降)
的ACTION_DRAG_ENDED情況下觸發4次,有效和無效滴,但我不知道爲什麼。有人可以告訴我爲什麼會發生這種情況嗎?
我的聽衆代碼如下。
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
if (convertView == null) {
convertView = inflater.inflate(R.layout.lv_item_stage, parent, false);
}
//setting text/images for the view
convertView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
START_POS = position;
ClipData data = ClipData.newPlainText("", "");
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
view.setVisibility(View.GONE);
return true;
} else {
return false;
}
}
});
convertView.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(final View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_ENTERED:
AbsListView.LayoutParams params = new AbsListView.LayoutParams(v.getWidth(), v.getHeight()*2);
if(position > START_POS){
//view dragged downwards
moveData(START_POS, position);
((LinearLayout) v).setGravity(Gravity.TOP);
}
else{
//view dragged upwards
moveData(START_POS, position);
((LinearLayout) v).setGravity(Gravity.BOTTOM);
}
v.setLayoutParams(params);
START_POS = position;
break;
case DragEvent.ACTION_DRAG_EXITED:
//go straight into ACTION_DROP case (resize view to original size)
case DragEvent.ACTION_DROP:
v.setLayoutParams(new AbsListView.LayoutParams(v.getWidth(), v.getHeight()/2));
break;
case DragEvent.ACTION_DRAG_ENDED:
//update list view if drop valid (inside list view)
if (event.getResult()){
Log.d("listView", "result = TRUE");
updateListView(tempData);
}
else{
Log.d("listView", "result = FALSE");
}
final View droppedView = (View) event.getLocalState();
droppedView.post(new Runnable() {
@Override
public void run() {
droppedView.setVisibility(View.VISIBLE);
}
});
break;
default:
break;
}
return true;
}
});
return convertView;
}