为什么我不能在Fragment中使用Listview

时间:2018-06-14 03:04:59

标签: android listview kotlin fragment

如何在Listview中使用Fragment。我在Activity中实现了几乎相似的代码,它完美地运行。但是在Fragment的情况下,我只修改了一点以避免Android Studio显示的错误。但是,它不在这里工作。 这是我的代码:

class FragmentMascot : Fragment() {
  override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view= inflater!!.inflate(R.layout.fragment_mascot, container, false)
    val listview = view.findViewById<ListView>(R.id.maskot_list)
    //listview.adapter = MaskotAdapter(this) -> this does't work in fragment but worked in activity
    listview.adapter = MaskotAdapter(context)
    return view
  }

我的MaskotAdapter课程是:

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

    private val mContext: Context

    //values can be entered from database too.

    private val maskot_names_list = arrayListOf<String>("","","","")

    private val maskot_details_list = arrayListOf<String>("","","","")

    private val maskot_images_list = arrayListOf<Int>(0,0,0,0)

    init {
      this.mContext = context
    }
    //row count
    override fun getCount(): Int {
      return maskot_names_list.size //To change body of created functions use File | Settings | File Templates.
    }

    override fun getItem(position: Int): Any {
      return "test String" //To change body of created functions use File | Settings | File Templates.
    }

    override fun getItemId(position: Int): Long {
      return position.toLong()//To change body of created functions use File | Settings | File Templates.
    }
    //renders each row
    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
      val layoutInflater = LayoutInflater.from(mContext)
      val maskot_row=layoutInflater.inflate(R.layout.activity_maskot_fragment, parent, false)

      val maskot_names = maskot_row.findViewById<TextView>(R.id.maskot_name)
      maskot_names.text=maskot_names_list.get(position)

      // showing ??? if maskot name is empty
      // and giving it a little padding top, to not to keep it on top
      if(maskot_names.text=="")
      {
        maskot_names.text="???"
        maskot_names.setPadding( 0, 16, 0, 0)
      }

      val maskot_details = maskot_row.findViewById<TextView>(R.id.maskot_details)
      maskot_details.text=maskot_details_list.get(position)


      if(maskot_images_list.get(position)!=0)
      {
        // showing particular maskot image if maskot image is not empty
        val maskot_image = maskot_row.findViewById<ImageView>(R.id.maskot_image)
        maskot_image.setImageResource(maskot_images_list.get(position))
      }
      return maskot_row
    }
  }

4 个答案:

答案 0 :(得分:1)

我终于找到了答案。我们也需要将活动作为参数。所以,在问题中提到的代码中:

listview.adapter = MaskotAdapter(context)

将更改为listview.adapter = MaskotAdapter(上下文,活动) 和

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

行应改为

private class MaskotAdapter(context: Context, activity: Activity): BaseAdapter() {

答案 1 :(得分:1)

在这里,活动参数非常重要。您可以像这样更改:

listview.adapter = MaskotAdapter(context)

将更改为

listview.adapter = MaskotAdapter(context,activity) 

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

行应更改为

private class MaskotAdapter(context: Context, activity: Activity): BaseAdapter() {

希望它会起作用。但是,请尽可能移至recyclerView,因为这样可以提高内存效率。

答案 2 :(得分:0)

您应该在实例化适配器中使用Activity上下文(getActivity)。片段没有上下文。

答案 3 :(得分:0)

列表不显示?或者有致命的例外吗?

使用RecyclerView。 每次调用膨胀而不使用getView()中的holder模式是一种低效的方式。