拖放不适用于nhaarman的ListviewAnimation库

时间:2014-09-30 09:38:28

标签: android drag-and-drop android-animation

我使用的是nhaarman的ListviewAnimation库https://github.com/nhaarman/ListViewAnimations,效果很好。

但我面临以下问题:

我面临的主要问题是,我无法调试我的代码。我已将四个必需的库直接复制/粘贴到libs文件夹中。将调试点放在任何listview方法(如onItemLongClick())中都不起作用。

第二个问题是,拖放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;
    }

3 个答案:

答案 0 :(得分: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 :(得分:5)

对于有同样问题的其他人 - Niek Haarman已在GitHub here上回答了这个问题。

不要看到GitHub很快就会崩溃,但是因为粘贴答案也是一个很好的基调,这里是:

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

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

position在这里不是一个稳定的ID。您需要该项目的稳定ID   这取决于职位。

答案 2 :(得分:0)

使用 import com.nhaarman.listviewanimations.ArrayAdapter;

而不是 import android.widget.ArrayAdapter;

这就是它不调用onItemMoved

的原因