ListView可以出现在Activity中,但不能出现在Fragment中
ListView可以出现在Activity
但不能出现在Fragment
但是我在Android Studio 3.0中使用Kotlin中的相同代码?
这是我的片段代码:
class testFrag : Fragment() { var adapter : mo3dAdapter?=null var listOfMkabala = ArrayList<MeetingDetails>() override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater!!.inflate(R.layout.fragment_test, container, false) listOfMkabala .add ( MeetingDetails(" nour1", "ahmed1" , "aya1")) listOfMkabala .add ( MeetingDetails(" nour2", "ahmed2" , "aya2")) listOfMkabala .add ( MeetingDetails(" nour3", "ahmed3" , "aya3")) listOfMkabala .add ( MeetingDetails(" nour4", "ahmed4" , "aya4")) listOfMkabala .add ( MeetingDetails(" nour5", "ahmed5" , "aya5")) listOfMkabala .add ( MeetingDetails(" nour6", "ahmed6" , "aya6")) adapter = mo3dAdapter (context ,listOfMkabala) tv1.adapter = adapter } fun test ( view: View){ }
这个我的适配器:
inner class mo3dAdapter: BaseAdapter { var listOfMkabaln= ArrayList<MeetingDetails>() var context:Context?=null constructor(context:Context, listOfMkabaln: ArrayList<MeetingDetails>):super(){ this.listOfMkabaln=listOfMkabaln this.context=context } override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View { val mo3d = listOfMkabaln[p0] var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater var myView = inflator.inflate(R.layout.fragment_test, null) myView.text1.text = mo3d.name1!! myView.text2.text = mo3d.name2!! myView.text3.text = mo3d.name3!! return myView } override fun getItem(p0: Int): Any { return listOfMkabaln[p0] } override fun getItemId(p0: Int): Long { return p0.toLong() } override fun getCount(): Int { return listOfMkabaln.size } }
你应该在你的onCreateView()
初始化之后做一个return语句。
您正在使用kotlin-android-extensions
直接获取您的视图。 如果使用这种方式,只有在创建视图后才能获得LisView
。
你的代码应该是这样的。
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater!!.inflate(R.layout.fragment_test, container, false) } override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) listOfMkabala .add ( MeetingDetails(" nour1", "ahmed1" , "aya1")) listOfMkabala .add ( MeetingDetails(" nour2", "ahmed2" , "aya2")) listOfMkabala .add ( MeetingDetails(" nour3", "ahmed3" , "aya3")) listOfMkabala .add ( MeetingDetails(" nour4", "ahmed4" , "aya4")) listOfMkabala .add ( MeetingDetails(" nour5", "ahmed5" , "aya5")) listOfMkabala .add ( MeetingDetails(" nour6", "ahmed6" , "aya6")) adapter = mo3dAdapter (context ,listOfMkabala) tv1.adapter = adapter }
onViewCreated()
在创建View之后运行。 所以它确保您的视图已经创建。
您也已经为您的适配器传递了相同的布局。
在您的适配器代码中,将R.layout.fragment_test
更改为您的模型布局。
var myView = inflator.inflate(R.layout.fragment_test, null)
希望它有助于:)
在我们称之为死代码(无法访问的代码)的return
语句之后,您在onCreateView
编写代码。 以这种方式,你永远不会在ListView
设置你的适配器。
按照3个步骤作为一般方法 –
- 在
onCreate
方法中初始化所有数据。 在你的情况下,在ArrayList
添加数据将会去那里。
这样看起来像 –
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) listOfMkabala .add ( MeetingDetails(" nour1", "ahmed1" , "aya1")) listOfMkabala .add ( MeetingDetails(" nour2", "ahmed2" , "aya2")) listOfMkabala .add ( MeetingDetails(" nour3", "ahmed3" , "aya3")) listOfMkabala .add ( MeetingDetails(" nour4", "ahmed4" , "aya4")) listOfMkabala .add ( MeetingDetails(" nour5", "ahmed5" , "aya5")) listOfMkabala .add ( MeetingDetails(" nour6", "ahmed6" , "aya6")) }
-
只有在
onCreateView
初始化您的布局资源。 喜欢这个 –override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater!!.inflate(R.layout.fragment_test, container, false) }
-
这与在UI上呈现数据有关,这应该在
onViewCreated
方法中完成。 在你的情况下,它应该喜欢 –override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) adapter = mo3dAdapter (context ,listOfMkabala) // Init your listview tv1 = view?.findViewById(R.id.your_listview_id); tv1.adapter = adapter }
确保你init tv1
,它应该是ListView
引用。