1

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)
Babanel
  • 23
  • 4
  • Please give the full stacktrace. Also, read [What is a NullPointerException, and how do I fix it?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Nicolas Feb 10 '21 at 20:53
  • Thank you for your comment. I updated the question with the full stacktrace. – Babanel Feb 11 '21 at 05:39

0 Answers0