0

I'm trying to add elements to a RecyclerView but I'm getting this error

java.lang.IllegalStateException: contact_list must not be null

Caused by: java.lang.IllegalStateException: contact_list must not be null at com.example.nuevaappcoche.MainActivity.onCreate(MainActivity.kt:62)

At line 62, this is the code:

 contact_list.layoutManager = LinearLayoutManager(this)

I tried the accepted answer of this post but still not working.

My code:

Fragment

 class CallFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_call, container, false)
    }
}

MainActivity

    class MainActivity : AppCompatActivity(),OnContactClickListener {

    private lateinit var callFragment: CallFragment
    private lateinit var navigationFragment: NavigationFragment
    private lateinit var musicFragment: MusicFragment

    private var contact = ContactDTO()
    private var position: Int = 0
    private var isPhoneCall = false
    private var lastState = TelephonyManager.CALL_STATE_IDLE


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setSupportActionBar(toolbar)

        callFragment = CallFragment()
        navigationFragment =
            NavigationFragment()
        musicFragment = MusicFragment()

        tablayout.setupWithViewPager(viewpager)
        var viewPagerAdapter:ViewPagerAdapter = ViewPagerAdapter(supportFragmentManager, 0)
        viewPagerAdapter.addFragment(navigationFragment,"")
        viewPagerAdapter.addFragment(callFragment,"")
        viewPagerAdapter.addFragment(musicFragment,"")

        viewpager.adapter = viewPagerAdapter

        tablayout.getTabAt(0)?.setIcon(R.drawable.ic_carbon_phone)
        tablayout.getTabAt(1)?.setIcon(R.drawable.ic_carbon_map)
        tablayout.getTabAt(2)?.setIcon(R.drawable.ic_carbon_music)

        contact_list.layoutManager = LinearLayoutManager(this)

        contact_list.addItemDecoration(
            DividerItemDecoration(
                contact_list.context,
                DividerItemDecoration.HORIZONTAL
            )
        )

        val contactList : MutableList<ContactDTO> = ArrayList()

        val contacts = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null)
        if (contacts != null) {
            while (contacts.moveToNext()){
                val name = contacts?.getString(contacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
                val number = contacts.getString(contacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
                val obj = ContactDTO()
                obj.name = name
                obj.number = number

                val photo_uri = contacts?.getString(contacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI))
                if(photo_uri != null){
                    obj.image = MediaStore.Images.Media.getBitmap(contentResolver,Uri.parse(photo_uri))
                }
                contactList.add(obj)
            }
        }
        contact_list.adapter = ContactAdapter(this,contactList,this)
        contacts?.close()

        crossImg.setOnClickListener{
            contact_details.visibility = View.GONE
        }
        ib_phone.setOnClickListener{
            callPhone()
        }

    }
    private fun callPhone() {
        if (tv_contact_phone != null) {
            val phoneNumber = tv_contact_phone.text.toString().trim()
            val intent = Intent(Intent.ACTION_CALL)

            intent.data = Uri.parse("tel:$phoneNumber")

            if (ActivityCompat.checkSelfPermission(
                    this,
                    android.Manifest.permission.CALL_PHONE
                ) == PackageManager.PERMISSION_GRANTED
            ) {
                lastState = TelephonyManager.CALL_STATE_RINGING
                isPhoneCall = true
                startActivity(intent)
            } else {
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(android.Manifest.permission.CALL_PHONE),
                    2000
                )
            }
        }
    }

    override fun onContactClick(contact: ContactDTO) {

        contact_details.visibility = View.VISIBLE
        this.contact = contact
        position = 0
        tv_contact_name.text = contact.name
        tv_contact_phone.text = contact.number

        if (contact.image != null) {
            civ_contact.setImageBitmap(contact.image)
        } else {
            civ_contact.setImageResource(R.drawable.ic_launcher_foreground)
        }
    }


    class ViewPagerAdapter(fm: FragmentManager, behavior: Int) :  FragmentPagerAdapter(fm, behavior) {

        private var fragments : MutableList<Fragment> = ArrayList()
        private var fragmentTitle : MutableList<String> = ArrayList()

        fun addFragment(fragment:Fragment,title:String){

            fragments.add(fragment)
            fragmentTitle.add(title)

        }
        override fun getItem(position: Int): Fragment {

            return fragments.get(position)
        }

        override fun getCount(): Int {
            return  fragments.size
        }

        override fun getPageTitle(position: Int): CharSequence? {
            return fragmentTitle.get(position)
        }

    }
}
UyerBit
  • 71
  • 6

1 Answers1

0

I believe that you are using kotlinx.android.synthetic.

Make sure that:

  • import kotlinx.android.synthetic.** is pointing to the correct layout
  • Your layout R.layout.activity_main is correct
  • contact_list should be exists in that layout, and the type should be recyclerView. (To make sure it is correct, check if there is any duplicate contact_list)

Another option is to use:

Dharman
  • 30,962
  • 25
  • 85
  • 135
Hendry Setiadi
  • 241
  • 1
  • 3