0

My project to make recycler View with dynamic list which is defined on Note type List on fragment in Basic Activity, first step for me to code the adapter, and cause am just at beginner level, I have no Experience about that in the lessons I don't Know why the application crash.

I hope to know the reason

I did not change any thing in Main Activity

The Note Type

class Note {

    var title: String? = null

    var description: String? = null

}

The Adapter

import androidx.recyclerview.widget.RecyclerView

import android.view.LayoutInflater

import android.view.View

import android.view.ViewGroup

import android.widget.TextView




class NoteAdapter( private val mNoteList: List<Note>) : RecyclerView.Adapter<NoteAdapter.ListItemHolder>()
 {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListItemHolder {

        val itemView = LayoutInflater.from(parent.context)
            .inflate(R.layout.listitem, parent, false)

        return ListItemHolder(itemView)
    }

    override fun onBindViewHolder(holder: ListItemHolder, position: Int) {
        val note: Note = mNoteList[position]
        holder.mTitle.text = note.title
        holder.mDescription.text = note.description

    }

    override fun getItemCount(): Int {
        return mNoteList.size
    }

    inner class ListItemHolder(view: View) : RecyclerView.ViewHolder(view),
        View.OnClickListener {
        var mTitle: TextView
        var mDescription: TextView



        init {
            mTitle = view.findViewById(R.id.textViewTitle)
            mDescription = view.findViewById(R.id.textViewDescription)

            view.isClickable = true
            view.setOnClickListener(this)
        }
        override fun onClick(view: View) {


        }
    }
}

The fragment

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.gamecodeschool.recyclerviewfromfragment.databinding.FragmentFirstBinding

/**
 * A simple [Fragment] subclass as the default destination in the navigation.
 */

class FirstFragment : Fragment() {

    private var recyclerView: RecyclerView? = null

    private var noteList: ArrayList<Note>? = null


    private var mAdapter: NoteAdapter? = null



    private var _binding: FragmentFirstBinding? = null


    // This property is only valid between     onCreat here`eView   and
    // onDestroyView.

    private val binding get() = _binding!!


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        _binding = FragmentFirstBinding.inflate(inflater, container, false)

        recyclerView = view?.findViewById(R.id.recyclerView)
        val mLayoutManager: RecyclerView.LayoutManager = LinearLayoutManager(requireContext())
        recyclerView!!.setLayoutManager(mLayoutManager)
        recyclerView!!.setItemAnimator(DefaultItemAnimator())

        // Add a neat dividing line between items in the list

        recyclerView!!.addItemDecoration(DividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL))

        mAdapter = NoteAdapter( noteList!!)
        recyclerView!!.setAdapter(mAdapter)


        return binding.root

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.buttonFirst.setOnClickListener {
            findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

listitem.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:outlineAmbientShadowColor="#615E5E"
    android:outlineSpotShadowColor="#AEB7E6"
    tools:layout_editor_absoluteX="5dp"
    tools:layout_editor_absoluteY="5dp">

    <TextView
        android:id="@+id/textViewTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="25dp"
        android:layout_marginEnd="25dp"
        android:padding="5dp"
        android:text="TextView"
        android:textSize="20sp"
        android:textStyle="italic"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <TextView
        android:id="@+id/textViewDescription"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="25dp"
        android:layout_marginStart="16dp"
        android:text="TextView"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

fragment_first.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FirstFragment">

    <Button
        android:id="@+id/button_first"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/next"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/recyclerView" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="1dp"
        android:layout_marginTop="1dp"
        android:layout_marginEnd="1dp"
        android:layout_marginBottom="1dp"
        app:layout_constraintBottom_toTopOf="@+id/button_first"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Crash stacktrace:

11732-11732/com.gamecodeschool.recyclerviewfromfragment E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.gamecodeschool.recyclerviewfromfragment, PID: 11732
    java.lang.NullPointerException
        at com.gamecodeschool.recyclerviewfromfragment.FirstFragment.onCreateView(FirstFragment.kt:40)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
        at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2646)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2416)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2372)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
        at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2466)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1483)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
        at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:620)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1419)
        at android.app.Activity.performStart(Activity.java:7479)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3454)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199)
        at android.os.Handler.dispatchMessage(Handler.java:112)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
m0skit0
  • 25,268
  • 11
  • 79
  • 127
Hany
  • 1
  • 1
  • Can you add the crash stacktrace to your question? – m0skit0 Jul 19 '22 at 12:38
  • https://developer.android.com/studio/debug/stacktraces – m0skit0 Jul 19 '22 at 18:37
  • I don't think that stacktrace belongs to your app. Filter by your app on the logcat window. – m0skit0 Jul 20 '22 at 07:58
  • yes you are true , I will change it in the code above the page , cause it is too long for comment here , I don't really know which part is important for you – Hany Jul 20 '22 at 12:11
  • You can see you have NullPointerException: `java.lang.NullPointerException at com.gamecodeschool.recyclerviewfromfragment.FirstFragment.onCreateView(FirstFragment.kt:40)`. Which line is that? – m0skit0 Jul 20 '22 at 12:23
  • I suggest you read this to understand what is stacktrace and how to read it: https://stackoverflow.com/questions/3988788/what-is-a-stack-trace-and-how-can-i-use-it-to-debug-my-application-errors. You will have to read stacktraces many times in your developer life! – m0skit0 Jul 20 '22 at 12:30
  • recyclerView!!.setLayoutManager(mLayoutManager) that is the line 40 – Hany Jul 20 '22 at 12:51
  • Then `recyclerView` is null. As a suggestion try to avoid the `!!` operator, it totally defeats the whole purpose of having the `?` operator. – m0skit0 Jul 20 '22 at 14:01
  • Note that you're trying to access `view?.findViewById(R.id.recyclerView)` when the view has not been created yet (`view` is null at that point). All that part when you're configuring your views should be done at `onViewCreated()` instead. – m0skit0 Jul 20 '22 at 14:04
  • I did what suggested in your last comment m0skit0 but it crashed again .For stack trace(java.lang.NullPointerException at com.gamecodeschool.recyclerviewfromfragment.FirstFragment.onViewCreated(FirstFragment.kt:56) >>>>line 56 is (((mAdapter = NoteAdapter( noteList!!)))) – Hany Jul 20 '22 at 16:45
  • noteList is null now as the stacktrace indicates. – m0skit0 Jul 20 '22 at 23:28

0 Answers0