gpt4 book ai didi

Android OnDragListener - ACTION_DRAG_ENDED 触发多次

转载 作者:行者123 更新时间:2023-11-30 01:22:07 28 4
gpt4 key购买 nike

我正在制作一个带有自定义行和自定义适配器的 ListView 。我已将 OnTouchListener 和 OnDragListener 附加到 ListView 中的每个 View 。

如果拖放结果为真(被拖动的 View 被拖放到 ListView 的边界内),我将更新基础数据

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

最佳答案

ACTION_DRAG_ENDED 将为您附加了拖动监听器的每个 View 触发一次。 ACTION_DRAG_STARTED 也是如此。因此,如果您将 onDragListener 附加到 4 个 View ,这些事件将触发 4 次。

关于Android OnDragListener - ACTION_DRAG_ENDED 触发多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36945641/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com