【问题标题】:ListView can appear in Activity but can't appear in FragmentListView可以出现在Activity中但不能出现在Fragment中
【发布时间】:2017-08-20 09:19:28
【问题描述】:

ListView 可以出现在 Activity 但不能出现在 Fragment 但是我在 Kotlin 中使用与 Android Studio 3.0 相同的代码?

这是我的片段代码:

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
    }

}

【问题讨论】:

  • 如果你使用Android Extensions,你必须提到它。

标签: android listview android-fragments kotlin


【解决方案1】:

你应该在你的初始化之后做一个return语句 onCreateView().

您正在使用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() 在视图创建后运行。因此它确保您的视图已经创建。

您也为适配器传递了相同的布局。

在您的适配器代码中,将 R.layout.fragment_test 更改为您的模型布局。

var myView = inflator.inflate(R.layout.fragment_test, null)

希望对你有帮助:)

【讨论】:

  • 不需要显式展开。双刘海!!应视为错误。
  • 解释一下,请@Xalamadrax
  • 当我在我的应用上打开片段时,它现在崩溃了
  • 等等,让我检查一下。@NourMedhat
  • 发布您的崩溃报告@NourMedhat
【解决方案2】:

您在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
    }
    

确保您初始化tv1,它应该是ListView 引用。

【讨论】:

  • 我在这一行有错误 tv1 = (ListView)view?.findViewById(R.id.tv1);
  • 什么错误?这是什么tv1?请显示您的导入,您是否使用 kotlin-android-extensions 进行 UI 映射
  • 您正在以 Java 方式进行投射。应该是view?.findViewById(R.id.your_listview_id) as ListView
  • @NourMedhat 请使用 view?.findViewById(R.id.your_listview_id) 而不是 (ListView)view?.findViewById(R.id.tv1)
猜你喜欢
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
相关资源
最近更新 更多