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个步骤作为一般方法 –

  1. 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")) } 
  1. 只有在onCreateView初始化您的布局资源。 喜欢这个 –

      override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater!!.inflate(R.layout.fragment_test, container, false) } 
  2. 这与在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引用。