Android 第一次在GridView中拖放时缺少ImageView源
我制作了一个拖放网格视图。除了第一次拖放外,所有操作都很完美。我找不到它只发生在第一次的原因 第一次将项目拖动到gridview中的其他项目上时,项目的imageview源将丢失。当我放下它的时候,来源就会被修复。。在那之后,一切都会正常运转。你知道我该如何解决这个问题或者奇怪行为的原因吗 这是我的touchListener,它将处理拖放操作:Android 第一次在GridView中拖放时缺少ImageView源,android,gridview,drag-and-drop,Android,Gridview,Drag And Drop,我制作了一个拖放网格视图。除了第一次拖放外,所有操作都很完美。我找不到它只发生在第一次的原因 第一次将项目拖动到gridview中的其他项目上时,项目的imageview源将丢失。当我放下它的时候,来源就会被修复。。在那之后,一切都会正常运转。你知道我该如何解决这个问题或者奇怪行为的原因吗 这是我的touchListener,它将处理拖放操作: mGridView.setOnTouchListener(new View.OnTouchListener() { @Override
mGridView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
GridView parent = (GridView) v;
int x = (int) event.getX();
int y = (int) event.getY();
int position = parent.pointToPosition(x, y);
if (position > AdapterView.INVALID_POSITION) {
int count = parent.getChildCount();
for (int i = 0; i < count; i++) {
View curr = parent.getChildAt(i);
curr.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
boolean result = true;
int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
break;
case DragEvent.ACTION_DRAG_LOCATION:
break;
case DragEvent.ACTION_DRAG_ENTERED:
setBlueFilterOnImageView((ImageView) v, getActivity());
break;
case DragEvent.ACTION_DRAG_EXITED:
clearColorFilterOnImageView((ImageView) v);
break;
case DragEvent.ACTION_DROP:
if (event.getLocalState() == v) {
result = false;
} else {
View droped = (View) event.getLocalState();
View target = v;
app.myProfile().removeProfilePhotoAtIndex(((DragGridItemHolder) droped.getTag()).position);
app.myProfile().insertProfilePhoto(((DragGridItemHolder) droped.getTag()).id, ((DragGridItemHolder) target.getTag()).position);
mAdapter.notifyDataSetChanged();
}
break;
case DragEvent.ACTION_DRAG_ENDED:
clearColorFilterOnImageView((ImageView) v);
break;
default:
result = false;
break;
}
return result;
}
});
}
int relativePosition = position - parent.getFirstVisiblePosition();
View target = (View) parent.getChildAt(relativePosition);
DragGridItemHolder holder = (DragGridItemHolder) target.getTag();
String text = holder.id;
ClipData data = ClipData.newPlainText("DragData", text);
target.startDrag(data, new View.DragShadowBuilder(target), target, 0);
}
}
return false;
}
});
我发现与您的查询相关的信息可能会对您有所帮助。很难理解您的长代码,因此请尝试从此链接进行管理
问题可能出在
mGridView.setOnTouchListener(新视图.OnTouchListener()…
一旦尝试像mGridView.setOnTouchListener(新OnTouchListener()…
一样操作,我认为您的代码中有几个问题:
a、 您的onTouch方法总是返回false,这通常意味着侦听器尚未使用该事件。因此,您应该在之后返回true
target.startDrag(data, new View.DragShadowBuilder(target), target, 0);
b、 您将onDragListener注册放在onTouch事件的处理方法中,我认为这可能是导致此问题的主要原因。当您删除拖动的项目时,onDragListener可能尚未注册。由于您的侦听器注册不依赖于源代码视图,您可以直接注册onDragListener。并生成代码像这样:
mGridView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
view.setVisibility(View.INVISIBLE);
return true;
} else {
return false;
}
}
};
for(View view : ...){
view.setOnDragListener(new View.OnDragListener() {
//put your implementation here
}
}
我终于找到了解决办法。所以问题是,当我在DrageEvent.ACTION\u DRAG\u中设置颜色过滤器时,ImageView源将消失。为了避免这种情况,我在设置颜色过滤器时重置了源。这不是一个非常干净的解决方案,但对我来说很有效。.Thnx获取所有帮助这两个语句是什么意思:“项目的imageview源已丢失”和“当我删除它时,源将被修复”视图是imageview。当我将imageview拖到其他一些imageview上时,这些imageview将停止显示图片(我已设置为imageview源的图像)。我将立即删除imageview,NotifyDataSangeetched()在gridview上,将调用适配器并再次显示所有图片。之后,一切正常,图片不会消失。对不起,我的英语不好。你在
setBlueFilterOnImageView
中做什么?如上所述,我添加了setBlueFilterOnImageView方法A我认为这与颜色过滤器有关。图像如果我不调用setColorFilter,图像视图的个不会消失。但我能做些什么来解决这个问题呢?THnx需要您的帮助。我的代码现在看起来像上面一样,但行为仍然相同。。
mGridView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
view.setVisibility(View.INVISIBLE);
return true;
} else {
return false;
}
}
};
for(View view : ...){
view.setOnDragListener(new View.OnDragListener() {
//put your implementation here
}
}