Android ListView Drag and Drop для сотовых и ICS «Ошибка: отчет о снижении: false»

Я пытаюсь создать ListView, который я могу сортировать, используя drag and drop.

Я попытался следовать руководству Android здесь, и здесь был приведен код исходного кода Git. Кроме того, я не хочу использовать пример приложения Music, поскольку я пытаюсь использовать новые инструменты, данные в Honeycomb и выше.

Пока мне удалось создать список, и я могу перетащить элементы. К сожалению, когда я бросаю элемент в список, я получаю следующую ошибку:

«I / ViewRoot (22739): отчет о снижении передачи: false».

У меня есть подозрение, что мой слушатель прослушивания не создан на нужном элементе, и, следовательно, никогда не будет вызван переход. Вот какой-то исходный код, большое вам спасибо за вашу помощь.

XML для списка:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dropTarget" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> <ListView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@android:id/list" > </ListView> </LinearLayout> 

Мой список: мне еще не удалось попасть в событие «ACTION_DROP», чтобы код не тестировался. Просто то, над чем я работал. Мой главный вопрос: я никогда не попадаю в ACTION_DROP.

 public class procedureListView extends ListActivity { private ListView mListView = null; private ArrayAdapter<String> mArrayAdapter = null; private View layoutDropArea = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list); String[] countries = getResources().getStringArray(R.array.arrayOfStuff); mArrayAdapter = new ArrayAdapter<String>(this, R.layout.list_item, countries); setListAdapter(mArrayAdapter); mListView = getListView(); mListView.setTextFilterEnabled(true); layoutDropArea = findViewById(R.id.dropTarget); setupDragDrop(); } /** * Setup what to do when we drag list items */ public void setupDragDrop(){ mListView.setOnItemLongClickListener(new OnItemLongClickListener() { public boolean onItemLongClick(AdapterView<?> arg0, View v, int position, long arg3){ String value = (String) ((TextView) v).getText(); ClipData data = ClipData.newPlainText("procedure", value); v.startDrag(data, new mDragShadowBuilder(v), null, 0); return true; } }); myDragListener mDragListener = new myDragListener(); //mListView.setOnDragListener(mDragListener); layoutDropArea.setOnDragListener(mDragListener); } protected class myDragListener implements OnDragListener{ public boolean onDrag(View v, DragEvent event) { final int action = event.getAction(); switch (action) { case DragEvent.ACTION_DRAG_ENTERED: v.setBackgroundColor(Color.GRAY); break; case DragEvent.ACTION_DRAG_EXITED: v.setBackgroundColor(Color.TRANSPARENT); break; case DragEvent.ACTION_DRAG_STARTED: break; case DragEvent.ACTION_DRAG_LOCATION: v.setVisibility(View.VISIBLE); // return processDragStarted(event); case DragEvent.ACTION_DROP: v.setBackgroundColor(Color.TRANSPARENT); int newPosition = mListView.getPositionForView(v); if (newPosition != ListView.INVALID_POSITION) return processDrop(event, newPosition); else return false; } return false; } } private boolean processDrop(DragEvent event, int newPosition) { ClipData data = event.getClipData(); if (data != null) { if (data.getItemCount() > 0) { Item item = data.getItemAt(0); String value = item.toString(); updateViewsAfterDropComplete(value, newPosition); return true; } } return false; } private void updateViewsAfterDropComplete(String listItem, int index) { Log.d("InsertItem", "Position: "+ index); mArrayAdapter.insert(listItem, index); mArrayAdapter.notifyDataSetChanged(); } private boolean processDragStarted(DragEvent event) { ClipDescription clipDesc = event.getClipDescription(); if (clipDesc != null) { return clipDesc.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN); } return false; } } 

Большое вам спасибо за вашу помощь!

ОБНОВИТЬ:

Я не мог понять, почему. Но когда я изменил случай переключения на это, он, казалось, работал:

 switch (action) { case DragEvent.ACTION_DRAG_ENTERED: //v.setBackgroundColor(Color.GRAY); return false; case DragEvent.ACTION_DRAG_EXITED: //v.setBackgroundColor(Color.TRANSPARENT); return true; case DragEvent.ACTION_DRAG_STARTED: return true; case DragEvent.ACTION_DRAG_LOCATION: //v.setVisibility(View.VISIBLE); return false; // return processDragStarted(event); case DragEvent.ACTION_DROP: v.setBackgroundColor(Color.TRANSPARENT); int newPosition = mListView.pointToPosition((int)(event.getX()),(int) event.getY()); Log.d("Position", Integer.toString(newPosition)); if (newPosition != ListView.INVALID_POSITION) return processDrop(event, newPosition); else return false; default: return true; } 

Ваше обновление onDrag проблему, потому что вы должны вернуть true из onDrag когда вы получаете DragEvent.ACTION_DRAG_STARTED , чтобы продолжить получать события перетаскивания к этому слушателю. В вашем обновлении вы возвращаете true для этого случая, поэтому вы продолжаете получать события перетаскивания, и логика сброса работает правильно.

Если вы не DragEvent.ACTION_DRAG_STARTED true для случая DragEvent.ACTION_DRAG_STARTED , ваш слушатель не получит никаких других событий, кроме DragEvent.ACTION_DRAG_ENDED .