在ListView中启用拖放排序列表时,从OnItemLongClickListener中出现NullPointerException。

6

我正在使用drag-sort-listview (https://github.com/bauerca/drag-sort-listview) 在一个ListFragment中。

当我在创建时启用dragsort时,一切正常。但是,我希望将其禁用,直到长按列表视图中的其中一个项目。

因此,我想设置

mDslv.setDragEnabled(false);

需要在三个地方进行修改:onCreateView()、DragSortListView.DropListener 和 DragSortListView.RemoveListener。

在我的ListFragment中,我有以下代码:

        listView.setOnItemLongClickListener( new AdapterView.OnItemLongClickListener(){ 
            @Override 
            public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) {
                mDslv.setDragEnabled(true);
                return true; 
            } 
        });

我希望长按任何项目都可以启用DSL并允许删除或移动该项目,之后DSL将再次禁用。

然而,在调用setDragEnabled(true)后(而不是同时),我遇到了NullPointerException:

09-03 00:03:33.749: E/AndroidRuntime(9703): FATAL EXCEPTION: main
09-03 00:03:33.749: E/AndroidRuntime(9703): java.lang.NullPointerException
09-03 00:03:33.749: E/AndroidRuntime(9703):     at com.mobeta.android.dslv.DragSortController.onScroll(DragSortController.java:381)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.GestureDetector.onTouchEvent(GestureDetector.java:541)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at com.mobeta.android.dslv.DragSortController.onTouch(DragSortController.java:243)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.View.dispatchTouchEvent(View.java:3881)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1703)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1133)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1687)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2196)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1880)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.os.Looper.loop(Looper.java:130)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at android.app.ActivityThread.main(ActivityThread.java:3729)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at java.lang.reflect.Method.invokeNative(Native Method)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at java.lang.reflect.Method.invoke(Method.java:507)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
09-03 00:03:33.749: E/AndroidRuntime(9703):     at dalvik.system.NativeStart.main(Native Method)

有人尝试过这个吗?有什么想法吗?看起来其中一个动作事件是NULL,可能是因为我在触摸事件期间启用了DSLV。

2个回答

1
我遇到了同样的问题 - 你能解决这个问题吗?
我的一个解决方案是将列表视图项上的拖动处理程序最初设置为GONE - 这样用户就无法拖动进行排序。当长按触发时,将拖动处理程序的可见性设置为VISIBLE。但是我在这里遇到的一个问题是,在长按后取消选择该项时,即使再次将拖动处理程序设置为GONE,用户仍然可以通过按下处理程序曾经存在的位置进行拖动排序。

0
你可以在你的布局XML中使用"dslv:drag_start_mode"属性。像这样:
<com.mobeta.android.dslv.DragSortListView
    xmlns:dslv="http://schemas.android.com/apk/res/com.yourdomain.test"
    android:id="@+id/custom_ticker_list"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:dividerHeight="1dp"
    android:childDivider="@color/line"
    dslv:drag_start_mode="onLongPress"
    />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接