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;
}