0

my application is giving the below error that you mentioned above and it says there is an error on line 69, but you have tried all the solutions and could not fix it. You are new to programming and trying to learn, so you are asking for help from experienced people like us. Can you please help me?

Error Message:

AndroidRuntime: FATAL EXCEPTION: main Process: com.example.kotlincountries, PID: 15240 kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initialized at com.example.kotlincountries.adapter.CountryAdapter.onCountryClicked(CountryAdapter.kt:69) at com.example.kotlincountries.databinding.ItemCountryBindingImpl$OnClickListenerImpl.onClick(ItemCountryBindingImpl.java:173) at android.view.View.performClick(View.java:7506) at android.view.View.performClickInternal(View.java:7483) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:29334) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

I have enabled two options in my gradle file.

 buildFeatures {
        viewBinding = true
        dataBinding = true

    }

I checked the connections in the XML file.

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="country"
            type="com.example.kotlincountries.model.Country" />
        <variable
            name="listener"
            type="com.example.kotlincountries.adapter.CountryClickListener" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:onClick="@{listener::onCountryClicked}"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/countryUuidText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:text="@{String.valueOf(country.uuid)}">

        </TextView>

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:padding="3dp"
            android:downloadUrl="@{country.imageUrl}">
            </ImageView>
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:gravity="center_vertical"
            android:layout_weight="3">
            
            <TextView
                android:id="@+id/name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{country.countryName}"
                android:padding="5dp"
                android:textSize="18sp"
                android:textStyle="bold">

            </TextView>

            <TextView
                android:id="@+id/region"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{country.countryRegion}"
                android:textSize="16sp"
                android:padding="5dp">


            </TextView>

        </LinearLayout>

    </LinearLayout>
</layout>

I checked the data I fetched in my adapter class.

class CountryAdapter(val countryList:ArrayList<Country>): RecyclerView.Adapter<CountryAdapter.CountryViewHolder>(),CountryClickListener {
    private lateinit var binding : ItemCountryBinding


    class CountryViewHolder(var view:ItemCountryBinding) :RecyclerView.ViewHolder(view.root) {

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CountryViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val binding = ItemCountryBinding.inflate(inflater, parent, false)

        return CountryViewHolder(binding)

    }

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

    override fun onBindViewHolder(holder: CountryViewHolder, position: Int) {

        holder.view.country=countryList[position]
        holder.view.listener=this


    }
    fun updateCountryList(newCountryList:List<Country>){
       
        countryList.clear()
        countryList.addAll(newCountryList)
        notifyDataSetChanged()
    }

    override fun onCountryClicked(v: View) {
        val uuid=binding.countryUuidText.text.toString().toInt()
        val action=FeedFragmentDirections.actionFeedFragmentToCountryFragment(uuid)
        Navigation.findNavController(v).navigate(action)
    }


}

Could you please help me? I couldn't find a solution even though I checked the connections in my XML file, verified the data in my adapter class.

Esmaeil Ahmadipour
  • 840
  • 1
  • 11
  • 32
aybey
  • 3
  • 3

1 Answers1

0

Error message is clear that binding variable which is declared as lateinit is not initialised and tried to use it in your adapter class .

and if you will check your code of adapter (as location mentioned in error) you will get that problem is in onCreateViewHolder

So just change in onCreateViewHolder method of adapter

From

val binding = ItemCountryBinding.inflate(inflater, parent, false)

To

binding = ItemCountryBinding.inflate(inflater, parent, false)

i have just removed val as you have already declared binding

jayesh gurudayalani
  • 1,368
  • 1
  • 9
  • 14
  • Thank you very much for your help, it worked. Since I am at the beginning of the road, I can overlook such small things. – aybey Feb 18 '23 at 09:36
  • Glad to know i could help you .. and we can understand you made mistake as you are learning and beginner . That's the only reason i have added specification about error as much as possible . kindly mark right as answer helped you so it can help others – jayesh gurudayalani Feb 20 '23 at 04:11