Frage NullPointerException beim Aktivieren von Drag-sort-listview von einem OnItemLongClickListener in einer Listenansicht


Ich verwende Drag-sort-listview (https://github.com/bauerca/drag-sort-listview) in einem ListFragment.

Die Dinge funktionieren, wenn ich den DragSort beim Erstellen aktiviere. Ich möchte es jedoch deaktiviert lassen, bis ein langer Klick auf eines der Elemente in der Listenansicht erscheint.

Also würde ich gerne einstellen

mDslv.setDragEnabled(false);

an 3 Stellen: onCreateView (), DragSortListView.DropListener und DragSortListView.RemoveListener

In meinem ListFragment habe ich:

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

Meine Hoffnung ist, dass ein langer Klick auf einen Gegenstand den DSLV einschaltet und erlaubt, dass dieser Gegenstand fallen gelassen oder entfernt wird, wonach DSLV wieder deaktiviert wird.

Nach (nicht while) dem Aufruf von setDrageEnabled (true) bekomme ich eine 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)

Hat jemand das versucht? Irgendwelche Ideen? Es sieht so aus, als ob eines der Bewegungsereignisse NULL ist, wahrscheinlich weil ich während eines Berührungsereignisses DSLV aktiviere.


6
2017-09-03 07:29


Ursprung


Antworten:


Ich treffe das gleiche Problem - konnten Sie das umgehen?

Eine Lösung, die ich hatte, war, den Drag-Handler auf dem Listenansichtselement zunächst auf GONE zu setzen - auf diese Weise kann der Benutzer nicht zum Sortieren ziehen. Wenn der lange Druck ausgelöst wird, setzen Sie die Sichtbarkeit des Drag-Handlers auf VISIBLE. Ein Problem, auf das Sie hier stoßen, ist, dass wenn Sie das Element nach langem Drücken wieder abwählen, selbst wenn Sie den Drag-Handler erneut auf GONE setzen, der Benutzer immer noch die Sortierung ziehen kann, indem er auf die Position des Handlers drückt.


1
2017-07-03 06:38



Sie können das Attribut "dslv: drag_start_mode" in Ihrem Layout-XML verwenden. so was:

<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"
    />

0
2018-01-29 13:35