Android:在片段中使用回收站视图的问题

时间:2019-10-08 10:19:54

标签: android android-fragments kotlin android-recyclerview

我在片段RecyclerView中使用ImagesliderFragment,首先它期望“ recyclerview不能为空”,因此在stackover流中,我得到一个答案,您应该使用以下行来初始化您的recyclerview: / p>

  frag_rv = view.findViewById(R.id.frag_rv) as RecyclerView

但是问题是它给了我错误。 only safe or non null asserted calls are allowed也是我的RecyclerView无法解决的问题,谁能向我解释这是什么问题?

code screenshot

ImagesliderFragment

class ImagesliderFragment : Fragment() {

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

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    inflater.inflate(R.layout.fragment_imageslider, container, false)
    frag_rv = view.findViewById(R.id.frag_rv) as RecyclerView
    frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, false)
    return view
}

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

}

4 个答案:

答案 0 :(得分:2)

尝试一下

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
) = 
    inflater.inflate(R.layout.fragment_imageslider, container, false).apply {
    frag_rv = findViewById(R.id.frag_rv) as RecyclerView //val frag_rv if it's not declared elsewhere 
    frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, false)
}

Also now no need to do findViewById()

示例代码

class ImagesliderFragment : Fragment() {

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

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {


    val myView = inflater.inflate(R.layout.fragment_imageslider, container, false)
    val frag_rv = myView.findViewById(R.id.frag_rv) as RecyclerView
    frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, false)

    return myView
}

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

}

答案 1 :(得分:0)

您可以将onCreateView方法更改为:

5903

通过这种方式,视图会膨胀(通过inflater.inflate),您正在使用它来查找RecyclerView。

答案 2 :(得分:0)

在使用view.findViewById之前,必须对其进行初始化,如下所示,还请在val之前使用frag_rv

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

  // here you have to initialize your view
  View view = inflater.inflate(R.layout.fragment_imageslider, container, false)
  val frag_rv = view.findViewById(R.id.frag_rv) as RecyclerView
  frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, false)

  return view
}

答案 3 :(得分:0)

您仅应使用onCreateView方法来扩大视图并在onViewCreated方法中绑定iew

class ImagesliderFragment : Fragment() {

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

    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?) = inflater.inflate(R.layout.fragment_imageslider, container, false)!!

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

        val frag_rv = view.findViewById<RecyclerView>(R.id.frag_rv)            frag_rv.layoutManager = LinearLayoutManager(context, LinearLayout.HORIZONTAL, 
            false)
    }
}