2014-09-30 3 views
6

Я использую библиотеку ListviewAnimation от nhaarman https://github.com/nhaarman/ListViewAnimations, которая отлично работает.Перетаскивание не работает в библиотеке ListviewAnimation nhaarman

Но я столкнулся следующие вопросы:

Основной проблемой я столкнулся в том, что я не в состоянии отладки мой код. Я напрямую копировал/вставлял четыре необходимые библиотеки в папку libs. Размещение точки отладки внутри любого из методов списка, например onItemLongClick(), не работает.

Вторая проблема заключается в том, что drag-drop listView не работает в моем коде. Всякий раз, когда я пытаюсь перетащить любой элемент списка, при удалении элемента списка элемент занимает ту же позицию, с которой он был перетаскивается.

Вот код, который я использовал:

listview.enableDragAndDrop(); 
listview.setDraggableManager(new TouchViewDraggableManager(
     R.id.list_row_draganddrop_textview)); 
listview.setOnItemMovedListener(this); 
listview.setOnItemLongClickListener(this); 

@Override 
    public void onItemMoved(final int originalPosition, final int newPosition) { 
     if (mToast != null) { 
      mToast.cancel(); 
     } 

     mToast = Toast.makeText(getApplicationContext(), "Moved" 
       + swingBottomInAnimationAdapter.getItem(newPosition) 
       + newPosition, Toast.LENGTH_SHORT); 
     mToast.show(); 
    } 

    @Override 
    public boolean onItemLongClick(final AdapterView<?> parent, 
      final View view, final int position, final long id) { 
     if (listview != null) { 
      listview.startDragging(position - listview.getHeaderViewsCount()); 
     } 
     return true; 
    } 

ответ

5

Всякий раз, когда я пытаюсь перетащить любой элемент списка, сыплются элемент списка, элемент занимает ту же позицию, из которой она была тащили.

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

@Override 
public void onItemMoved(final int originalPosition, final int newPosition) { 
    if (mToast != null) { 
     mToast.cancel(); 
    } 

    mToast = Toast.makeText(getApplicationContext(), "Moved" 
      + swingBottomInAnimationAdapter.getItem(newPosition) 
      + newPosition, Toast.LENGTH_SHORT); 
    mToast.show(); 

    // Adapt the following to your implementation 

    if (originalPosition != newPosition) { 
      YourObject item = (YourObject) yourAdapter.getItem(originalPosition); 
      yourAdapter.moveItem(item, newPosition); 
    } 
} 

метод, упомянутый выше, будет выглядеть примерно так:

public void moveItem(YourObject item, int newIndex) { 
    if (mEntries != null) { 
     mEntries.remove(item); 
     mEntries.add(newIndex, item); 
     notifyDataSetChanged(); 
    } 
} 

Если вы идете через источник кода, вы увидите, что то, что вы перетаскиваете, - это Bitmap. Элемент списка находится в исходном положении.

+1

My onItemMoved() не получает вызов даже после вызова listview.setOnItemMovedListener (this); – 2014-10-06 10:23:27

+0

Что это такое в коде? Я имею в виду ArrayList или объект, который задает элементы одной строки или чего-то еще? –

+0

@ HirakChhatbar mEntries - это ArrayList в этих сценариях. Но это может быть любая структура данных, которую вы передаете в ваш BaseAdapter или ArrayAdapter. – Athena

0

использовать импорт com.nhaarman.listviewanimations.ArrayAdapter;

вместо импорт android.widget.ArrayAdapter;

, что является причиной не призвание onItemMoved

+0

Да, вам нужно это сделать. И как только вы это сделаете - вам не нужны бизнес 'onItemMoved' и' moveItem', описанный в ответе Афины. 'onItemMoved' - это просто слушатель, чтобы рассказать вам, когда такое действие было завершено. Логика замены происходит внутри настраиваемого ArrayAdapter. –

5

Для других, имеющих ту же проблемы - Niek Haarman ответил на этот вопрос на GitHub here.

Не видит GitHub спускаясь в ближайшее время, но, как это хороший тон, чтобы вставить ответ тоже здесь:

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public boolean hasStableIds() { 
    return true; 
} 

position не является стабильным идентификатор здесь. Вам нужен стабильный идентификатор для элемента , который не зависит от позиции.

+0

Правильно! Это была проблема для меня! Мое решение: @Override public long getItemId (int position) { return list.get (position) .hashCode(); } где список - это ArrayList, который я использовал –