Pawan Acharya
Pawan Acharya

Reputation: 141

How to resolve "recyclerView must not be null"

I am trying to Implement Recycler View in Activity after parsing data using Retrofit.But the problem is it shows Recycler view cannot be null even after initializing inside onCreate method before accessing.

Mainactitivty.kt

        class MainActivity : AppCompatActivity() {
        lateinit var myRecyclerView: RecyclerView

        override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        retroInstance = RetroInstance()
        val instance = retroInstance.getInstance()
        val api = instance.create(RetroInterface::class.java)
        val callAll=api.getAllDetail()
    callAll.enqueue(object :retrofit2.Callback<ModelAll>{
           override fun onFailure(call: Call<ModelAll>, t: Throwable) {
               Toast.makeText(applicationContext,t.message,Toast.LENGTH_LONG).show()
           }

           override fun onResponse(call: Call<ModelAll>, response: Response<ModelAll>) {
               val allDetail=response.body()!!
                myRecyclerView=findViewById(R.id.recyclerView)
              myRecyclerView.layoutManager=LinearLayoutManager(this@MainActivity)
               myRecyclerView.adapter=CoronaAdapter(allDetail)
           }

       })
    }
  }

Activity with recycler view included

<?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=".AllCountries">


    <SearchView
        android:id="@+id/searchView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="2dp"
        android:layout_marginTop="5dp"
        android:layout_marginEnd="2dp"
        android:background="@drawable/custom_search"
        android:elevation="5dp"
        android:queryHint="Search here..."
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="5dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/searchView" />
</androidx.constraintlayout.widget.ConstraintLayout>

Logcat https://gist.github.com/devpawann/af3cef9d204a6f99cd7ed11937684fa2

EDIT:- Issue solved, the mistake was that I initializes recycler view in another activity class

Upvotes: 2

Views: 2566

Answers (2)

Biscuit
Biscuit

Reputation: 5247

You can maybe try something like this:

class MainActivity : AppCompatActivity() {
        private var allDetails: MutableList<ModelAll> = ArrayList()

        override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        retroInstance = RetroInstance()
        val instance = retroInstance.getInstance()
        val api = instance.create(RetroInterface::class.java)
        val callAll=api.getAllDetail()


        //Init your recyclerview
        val myRecyclerView = findViewById(R.id.recyclerView)
        myRecyclerView.layoutManager=LinearLayoutManager(this)
        val coronaAdapter = CoronaAdapter(allDetails)
        myRecyclerView.adapter = adapter

        callAll.enqueue(object :retrofit2.Callback<ModelAll>{
           override fun onFailure(call: Call<ModelAll>, t: Throwable) {
               Toast.makeText(applicationContext,t.message,Toast.LENGTH_LONG).show()
           }

           override fun onResponse(call: Call<ModelAll>, response: Response<ModelAll>) {
               if(response.isSucessful()){
                    allDetails = response.body()!!
                    coronaAdapter.notifyDataSetChanged()
               }
           }

       })
}

EDIT: The issue was that the recyclerView was in another layout that the one inflated.

Upvotes: 1

Debarshi Bhattacharjee
Debarshi Bhattacharjee

Reputation: 830

Your recyclerView has not been instantiated(currently it is referring to null).

Add this line

 recyclerview = findViewById(R.id.recyclerView)

Or if you are using Android Extensions then make sure you are using correct recyclerview

Upvotes: 1

Related Questions