With the code bellow i managed to get the drag and drop to work in a RecyclerView but when i try to set a handle icon to begin dragging i get the following error:
2021-02-10 22:15:53.999 12779-12779/com.example.tickettoridehelper E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tickettoridehelper, PID: 12779
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getLayoutDirection()' on a null object reference
Bellow is the relevant code (i've marked the block of code that starts the problem in the PlayerNameRecyclerViewAdapter):
MainMenuFragment
private lateinit var layoutManager: RecyclerView.LayoutManager
private lateinit var adapter: PlayerNameRecyclerViewAdapter
private lateinit var binding: FragmentMainMenuBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main_menu, container, false)
return binding.root
}
private val itemTouchHelper by lazy {
val simpleItemTouchCallback =
object : ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP or
ItemTouchHelper.DOWN or
ItemTouchHelper.START or
ItemTouchHelper.END, 0) {
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?,
actionState: Int) {
super.onSelectedChanged(viewHolder, actionState)
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
viewHolder?.itemView?.alpha = 0.5f
}
}
override fun clearView(recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder) {
super.clearView(recyclerView, viewHolder)
viewHolder.itemView.alpha = 1.0f
}
override fun onMove(recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder): Boolean {
val adapter = recyclerView.adapter as PlayerNameRecyclerViewAdapter
val from = viewHolder.adapterPosition
val to = target.adapterPosition
adapter.moveItem(from, to)
adapter.notifyItemMoved(from, to)
return true
}
}
ItemTouchHelper(simpleItemTouchCallback)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
layoutManager = LinearLayoutManager(context)
binding.playerNameReciclerView.layoutManager = layoutManager
adapter = PlayerNameRecyclerViewAdapter()
binding.playerNameReciclerView.adapter = adapter
itemTouchHelper.attachToRecyclerView(binding.playerNameReciclerView)
}
fun startDragging(viewHolder: RecyclerView.ViewHolder) {
itemTouchHelper.startDrag(viewHolder)
}
}
PlayerNameRecyclerViewAdapter
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
//Daca vreau sa refolosesc viewHolderul ar trebui sa nu am chestii aici
val editTextView: EditText = view.findViewById(R.id.numeJucator)
val handleView: ImageView = view.findViewById(R.id.handleView)
init {
// Define click listener for the ViewHolder's View.
}
}
// Create new views (invoked by the layout manager)
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): PlayerNameRecyclerViewAdapter.ViewHolder {
// Create a new view, which defines the UI of the list item
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.player_name_recyclerview_item, viewGroup, false)
val viewHolder = ViewHolder(view)
val mainMenuFragment = MainMenuFragment()
// ........ WITHOUT THIS PIECE OF CODE, EVERYTHING WORKS FINE.........................
viewHolder.handleView.setOnTouchListener{ view, event ->
if (event.actionMasked == MotionEvent.ACTION_DOWN) {
mainMenuFragment.startDragging(viewHolder)
}
return@setOnTouchListener true
}
// ...........................................................................
return ViewHolder(view)
Please help me understand what am i doing wrong. Thanks.
UPDATE - full stacktrace
2021-02-11 07:35:08.434 13777-13777/com.example.tickettoridehelper E/InputEventReceiver: Exception dispatching input event.
2021-02-11 07:35:08.435 13777-13777/com.example.tickettoridehelper E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
2021-02-11 07:35:08.443 13777-13777/com.example.tickettoridehelper E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getLayoutDirection()' on a null object reference
at androidx.core.view.ViewCompat.getLayoutDirection(ViewCompat.java:1596)
at androidx.recyclerview.widget.ItemTouchHelper$Callback.getAbsoluteMovementFlags(ItemTouchHelper.java:1594)
at androidx.recyclerview.widget.ItemTouchHelper$Callback.hasDragFlag(ItemTouchHelper.java:1598)
at androidx.recyclerview.widget.ItemTouchHelper.startDrag(ItemTouchHelper.java:1092)
at com.example.tickettoridehelper.MainMenuFragment.startDragging(MainMenuFragment.kt:123)
at com.example.tickettoridehelper.PlayerNameRecyclerViewAdapter$onCreateViewHolder$1.onTouch(PlayerNameRecyclerViewAdapter.kt:54)
at android.view.View.dispatchTouchEvent(View.java:11772)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:448)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1829)
at android.app.Activity.dispatchTouchEvent(Activity.java:3307)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:410)
at android.view.View.dispatchPointerEvent(View.java:12015)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4795)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4609)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4147)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4200)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4166)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4293)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4174)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4350)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4147)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4200)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4166)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4174)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4147)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6661)
at androi
2021-02-11 07:35:08.443 13777-13777/com.example.tickettoridehelper D/AndroidRuntime: Shutting down VM
--------- beginning of crash
2021-02-11 07:35:08.458 13777-13777/com.example.tickettoridehelper E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tickettoridehelper, PID: 13777
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getLayoutDirection()' on a null object reference
at androidx.core.view.ViewCompat.getLayoutDirection(ViewCompat.java:1596)
at androidx.recyclerview.widget.ItemTouchHelper$Callback.getAbsoluteMovementFlags(ItemTouchHelper.java:1594)
at androidx.recyclerview.widget.ItemTouchHelper$Callback.hasDragFlag(ItemTouchHelper.java:1598)
at androidx.recyclerview.widget.ItemTouchHelper.startDrag(ItemTouchHelper.java:1092)
at com.example.tickettoridehelper.MainMenuFragment.startDragging(MainMenuFragment.kt:123)
at com.example.tickettoridehelper.PlayerNameRecyclerViewAdapter$onCreateViewHolder$1.onTouch(PlayerNameRecyclerViewAdapter.kt:54)
at android.view.View.dispatchTouchEvent(View.java:11772)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2968)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:448)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1829)
at android.app.Activity.dispatchTouchEvent(Activity.java:3307)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:410)
at android.view.View.dispatchPointerEvent(View.java:12015)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4795)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4609)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4147)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4200)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4166)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4293)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4174)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4350)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4147)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4200)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4166)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4174)
2021-02-11 07:35:08.461 13777-13777/com.example.tickettoridehelper E/AndroidRuntime: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4147)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6661)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6635)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6596)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6764)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:325)
at android.os.Looper.loop(Looper.java:142)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)