我拖放了GridView。除了第一次拖放外,一切都很完美。我无法找到它第一次发生的原因。
第一次将项目拖动到gridview中的其他项目时,项目的imageview源将丢失。当我放弃它时,源将被修复。之后,每件事都会正常工作。任何想法我如何解决这个或奇怪的行为的原因。欢迎提供每一个帮助。
这是我的touchListener,它将处理拖放:
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;
}
});
修改
public static void setBlueFilterOnImageView(ImageView imageView, Context context){
PorterDuffColorFilter blueFilter = new PorterDuffColorFilter(
context.getResources().getColor(R.color.grid_state_focused),
PorterDuff.Mode.SRC_ATOP);
imageView.setColorFilter(blueFilter);
imageView.setBackgroundColor(context.getResources().getColor(
R.color.grid_state_pressed));
}
答案 0 :(得分:1)
我发现this与您的查询相关可能会对您有所帮助。很难理解你的长代码,所以试着从这个链接进行管理。
问题可能在mGridView.setOnTouchListener(new View.OnTouchListener() ...
尝试mGridView.setOnTouchListener(new OnTouchListener() ...
答案 1 :(得分:0)
我认为您的代码中存在一些问题:
一个。您的onTouch方法始终返回false,这通常意味着侦听器尚未使用该事件。所以你应该在
后返回truetarget.startDrag(data, new View.DragShadowBuilder(target), target, 0);
湾您将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
}
}
答案 2 :(得分:0)
我终于找到了解决方法。所以问题是当我在DragEvent.ACTION_DRAG_ENTERED中设置一个Color Filter时,ImageView源将会消失。为避免这种情况,我在设置彩色滤镜时重置了源。不是一个非常干净的解决方案,但它对我有用.. Thnx的所有帮助