Несоответствие типов: предполагаемый тип является FragmentActivity? но контекст ожидался - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу вставить сетку меню в tablayout с помощью kotlin. Я искал много ссылок в Google, но это не поможет, все еще получая 1 ошибку в adapter = FoodAdapter(this, foodsList). там написано: «Несоответствие типов: выведенный тип в качестве фрагмента, но контекст ожидался». это мой код для фрагмента Home.kt

package com.example.ako.nextbrilliantgeneration

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.content.Context
import android.support.v4.app.FragmentActivity
import kotlinx.android.synthetic.main.fragment_fragment_home.*
import kotlinx.android.synthetic.main.menu_entry.view.*

private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

class fragmentHome : Fragment() {


var adapter: FoodAdapter? = null
var foodsList = ArrayList<Menu>()


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


): View? {

    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_fragment_home, container, false)

    foodsList.add(Menu("Coffee", R.drawable.profile))
    foodsList.add(Menu("Espersso", R.drawable.profile))
    foodsList.add(Menu("French Fires", R.drawable.profile))
    foodsList.add(Menu("Honey",R.drawable.profile))
    foodsList.add(Menu("Strawberry", R.drawable.profile))
    foodsList.add(Menu("Sugar cubes", R.drawable.profile))
    adapter = FoodAdapter(this, foodsList)

    gvFoods.adapter = adapter


}

class FoodAdapter : BaseAdapter {
    var foodsList = ArrayList<Menu>()
    var context: Context? = null


    constructor(context: Context, foodsList: ArrayList<Menu>) : super() {
        this.context = context
        this.foodsList = foodsList
    }

    override fun getCount(): Int {
        return foodsList.size
    }

    override fun getItem(position: Int): Any {
        return foodsList[position]
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val food = this.foodsList[position]

        var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        var foodView = inflator.inflate(R.layout.menu_entry, null)
        foodView.imgFood.setImageResource(food.image!!)
        foodView.tvName.text = food.name!!

        return foodView
    }
}

}

есть ли решение?

спасибо

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Ваш адаптер принимает ненулевое Context, но вы передаете Fragment. Вы можете попробовать передать свою активность из вашего фрагмента:

adapter = FoodAdapter(activity!!, foodsList)

Или, если у вас установлена ​​последняя библиотека поддержки:

adapter = FoodAdapter(requireActivity(), foodsList)

Вы получаете недоступную ошибку, потому что вы возвращаетесь из метода слишком рано, просто переместите его вниз:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
    foodsList.add(Menu("Coffee", R.drawable.profile))
    foodsList.add(Menu("Espersso", R.drawable.profile))
    foodsList.add(Menu("French Fires", R.drawable.profile))
    foodsList.add(Menu("Honey",R.drawable.profile))
    foodsList.add(Menu("Strawberry", R.drawable.profile))
    foodsList.add(Menu("Sugar cubes", R.drawable.profile))
    adapter = FoodAdapter(this, foodsList)

    gvFoods.adapter = adapter

    // move this line to last
    return inflater.inflate(R.layout.fragment_fragment_home, container, false)
}
0 голосов
/ 06 декабря 2018

Это отличное обновление, чтобы помочь разработчикам, которые пишут на Kotlin. Метод getActivity был помечен @Nullable для лучшей поддержки нулевой безопасности Kotlin. Раньше этот метод мог возвращать нуль и, следовательно, вызывал IllegalStateException в коде Котлина, потому что нулевой объект использовался бы там, где ожидался ненулевой тип.

Чтобы лучше обрабатывать эти случаи для методов, аннотированных @Nullable, используйте оператор let, чтобы развернуть обнуляемый объект в ненулевой объект.

getActivity()?.let { adapter = FoodAdapter(it, foodList) }

НЕ используйте requireActivity(), чтобы «гарантировать» ненулевое действие, потому что этот метод вызовет исключение, если ваше действие окажется нулевым.

0 голосов
/ 08 ноября 2018

Ошибка достаточно очевидна, вы пытаетесь передать this, что относится к Fragment object, но вашему адаптеру требуется Context, затем попробуйте передать Activity, что extends from Context.

Заменить эту строку

adapter = FoodAdapter(this, foodsList)

С

adapter = FoodAdapter(getActivity(), foodsList)

Обновление

вызовы методов get и set Java, которые можно заменить с использованием синтетических свойств Kotlin.

getActivity()  --> activity
...