Я создал операцию перетаскивания в моем приложении для переупорядочения элементов с помощью кода, найденного here.проблема с перетаскиванием android
Один из видов деятельности включает в себя переупорядочение изображений, поэтому я добавил изображение в макет и скорректировал код для добавления правильных изображений и всего этого. Все работает отлично, за исключением того, что при захвате предметов первый элемент, который вы извлекаете из каждого слота, всегда отображается, когда вы захватываете любой другой предмет из этого слота.
Так, например, скажем, у меня есть элементы a, b, c и d, если я возьму элемент a и переместите его в конец, b теперь находится в этом первом слоте. если я возьму элемент b сейчас, плавающее представление, которое перетаскивается, все еще показывает. Когда он отбрасывается, все выглядит нормально и находится в новом порядке, в котором он должен находиться. Теперь в том же примере, если я возьму второй элемент, который теперь является элементом c, и перемещаю его в любом месте, происходит то же самое. Перетаскивание первого элемента всегда показывает a, а второе всегда показывает c.
Я также могу взять элемент a, переместить его на второй, затем третий, затем четвертый и т. Д., Слот, а затем независимо от того, какой элемент я захватил, элемент a всегда тот, который отображается, когда объект перетаскивается.
Я смущен относительно того, что вызывает это, я думаю, что это может быть связано с этим разделом кода, в частности с Cache.
private void startDrag(int itemIndex, int y) {
stopDrag(itemIndex);
Log.i("startdrag","view " + itemIndex);
View item = getChildAt(itemIndex);
if (item == null) return;
item.setDrawingCacheEnabled(true);
if (mDragListener != null)
mDragListener.onStartDrag(item);
// Create a copy of the drawing cache so that it does not get recycled
// by the framework when the list tries to clean up memory
Bitmap bitmap = Bitmap.createBitmap(item.getDrawingCache());
WindowManager.LayoutParams mWindowParams = new WindowManager.LayoutParams();
mWindowParams.gravity = Gravity.TOP;
mWindowParams.x = 0;
mWindowParams.y = y - mDragPointOffset;
mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
mWindowParams.format = PixelFormat.TRANSLUCENT;
mWindowParams.windowAnimations = 0;
Context context = getContext();
ImageView v = new ImageView(context);
v.setImageBitmap(bitmap);
WindowManager mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(v, mWindowParams);
mDragView = v;
}
Оригинальное приложение также иногда показывает неправильный деталь, когда тащит, но я не могу заставить его надежно повторить, поэтому я думаю, что это что-то делать с кэшем рисования. Моя версия имеет изображения и, вероятно, пытается сохранить память, повторно используя старые представления. Я действительно не знаю, если есть больше, мне нужно просто спросить.
Заранее спасибо.
круто, это работает, и пример в ссылке выглядит лучше с анимацией, чем то, что у меня есть, так что я мог бы просто поменять и попробовать работать с этим кодом. Благодаря! – JStephen