Как я могу добавить ListView во фрагмент с помощью TabLayout?

#android #kotlin

#Android #kotlin

Вопрос:

Я действительно новичок в Kotlin. Я пытался создавать скользящие страницы с помощью TabLayout . У меня есть 3 разных Fragments , и мне нужно добавить ListView или RecyclerView к этим фрагментам, но на данный момент я не могу понять, где я должен добавить адаптер ListView . Я добавляю класс адаптера в файл Kotlin фрагмента, но я не могу подключить его и фрагментировать.(Я думаю) Я получил сообщение об ошибке, которое ListView не может быть нулевым, поэтому я могу сказать, что мой адаптер работал неправильно. Как я могу это решить?

Здесь я добавляю свои коды:

Мой код SecondFragment.kt:

 class SecondFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val listView = view!!.findViewById<ListView>(R.id.main_listview)


    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val listView = view!!.findViewById<ListView>(R.id.main_listview)
        return inflater.inflate(R.layout.fragment_second, container, false)


    }



    private class MyCustomAdapter(context: Context): BaseAdapter(){

        private val mContext : Context

        private val names = arrayListOf<String>("Test Name", "Steve Jobs", "Tim Cook", "Kobe King")

        init {
            mContext = context
        }

        // BURADA KAC TANE ROW OLDUGUNUN SOYLER..
        override fun getCount(): Int {
            return names.size
        }

        override fun getItem(position: Int): Any {

            return "Test String"
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
            //val textView = TextView(mContext)
            //textView.text = "Here my first row for list view.."
            //return textView

            val layoutInflater = LayoutInflater.from(mContext)
            val rowMain = layoutInflater.inflate(R.layout.row_for_list, parent, false)


            val nameTextView = rowMain.findViewById<TextView>(R.id.name_textView)
            nameTextView.text = names.get(position)

            val positionTextView = rowMain.findViewById<TextView>(R.id.position_textview)
            positionTextView.text = "Row Number: $position"

            return rowMain

        }


    }
}
  

Вот мой код файла ViewPagerAdapter.kt:

 class ViewPagerAdapter(supportFragmentManager: FragmentManager) : FragmentPagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

    private val mFragmentList = ArrayList<Fragment>()
    private val mFragmentTitleList = ArrayList<String>()


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

    override fun getItem(position: Int): Fragment {
        return mFragmentList[position]
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return mFragmentTitleList[position]
    }

    fun addFragment(fragment: Fragment, title: String){
        mFragmentList.add(fragment)
        mFragmentTitleList.add(title)
    }




}
  

И вот мой код файла MainActivity.kt:

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

        setUpTabs()

    }
    private fun setUpTabs() {

        val adapter = ViewPagerAdapter(supportFragmentManager)
        adapter.addFragment(HomeFragment(), "Home")
        adapter.addFragment(SecondFragment(), "Second")
        adapter.addFragment(ThirdFragment(), "Third")

        viewPager.adapter = adapter
        tabs.setupWithViewPager(viewPager)

        tabs.getTabAt(0)!!.setIcon(R.drawable.ic_baseline_account_box_24)
        tabs.getTabAt(1)!!.setIcon(R.drawable.ic_baseline_add_ic_call_24)
        tabs.getTabAt(2)!!.setIcon(R.drawable.ic_baseline_adb_24)

    }

}
  

Ответ №1:

Вы должны настроить создание экземпляра адаптера и установить его в ListView, я также объяснил некоторые вещи в комментариях.

 class SecondFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //don't do this in onCreate, do it in onViewCreated or onCreateView
        //val listView = view!!.findViewById<ListView>(R.id.main_listview)


    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val root = inflater.inflate(R.layout.fragment_second, container, false)

        //you can set adapter here if you want, but i did it in onViewCreated

        //return it
        return root
    }


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

        //get reference to ListView
        val listView = root.findViewById<ListView>(R.id.main_listview)

        //set adapter
        listView.adapter = MyCustomAdapter(requireContext())
    }


    private class MyCustomAdapter(private val mContext: Context): BaseAdapter(){

        //do initiation here as it needs to be done only once
        private val layoutInflater: LayoutInflater = LayoutInflater.from(mContext)

        private val names = arrayListOf<String>("Test Name", "Steve Jobs", "Tim Cook", "Kobe King")


        // BURADA KAC TANE ROW OLDUGUNUN SOYLER..
        override fun getCount(): Int {
            return names.size
        }

        override fun getItem(position: Int): Any {

            return "Test String"
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
            //val textView = TextView(mContext)
            //textView.text = "Here my first row for list view.."
            //return textView

            val rowMain = layoutInflater.inflate(R.layout.row_for_list, parent, false)


            val nameTextView = rowMain.findViewById<TextView>(R.id.name_textView)
            nameTextView.text = names.get(position)

            val positionTextView = rowMain.findViewById<TextView>(R.id.position_textview)
            positionTextView.text = "Row Number: $position"

            return rowMain

        }


    }
}
  

Ответ №2:

Попробуйте это :

 override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view=inflater.inflate(R.layout.fragment_second, container, false)
        val listView = view!!.findViewById<ListView>(R.id.main_listview)

       val myListAdapter = MyCustomAdapter(container!!.context)
    listView.adapter = myListAdapter
    

        return view


    }
  

Комментарии:

1. Я пытался сейчас, но в val myListAdapter = MyCustomAdapter(this) , выдает ошибку несоответствия типа. В нем указано, что требуется: найден контекст: SecondFragment

2. val myListAdapter = MyCustomAdapter(контейнер !!.context) ListView.adapter = myListAdapter