为什么不能在Kotlin中初始化onCreateViewHolder的属性?

时间:2018-12-03 08:34:56

标签: kotlin

我在mListMy事件中初始化了属性onCreateViewHolder,但收到错误

lateinit属性mListMy尚未初始化

我该如何解决?

代码

class MydAdapter () : RecyclerView.Adapter<MydAdapter.MyViewHolder>() {

   private lateinit var mListMy: List<MRecord>

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MydAdapter.MyViewHolder {
        initListMy()

        val v = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview_my, parent, false)
        return MyViewHolder(v)
    }

    fun initListMy(){
        mListMy=RecordHandler().listAllRecord(ESortBy.NameAsc,ECategory.My)
    }

    override fun onBindViewHolder(holder: MydAdapter.MyViewHolder, position: Int) {
        holder.bindItems(mListMy[position])
    }

}

3 个答案:

答案 0 :(得分:1)

要初始化属性,可以使用<select ng-model="thridCountry" id="thridCountry" ng-change="change()" required class="form-control" > <option ng-value="0">Select 3rd Country</option> <option ng-disabled="secondCountry=='india'">india</option> <option ng-disabled="secondCountry=='usa'">usa</option> <option ng-disabled="secondCountry=='Japan'">Japan</option> </select> 的kotlin块。在构造函数调用之后调用。

init

答案 1 :(得分:0)

在Kotlin lateinit修饰符中,不允许带有初始化器的属性。 lateinit表示您稍后将在initilizer中为该变量分配值。

在这种情况下,您可以使用普通的var。否则应该是这样的构造器

class MydAdapter (va1 mListMy:List<YourDatamodel> ) : RecyclerView.Adapter<MydAdapter.MyViewHolder>() {



override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MydAdapter.MyViewHolder {

    val v = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview_my, parent, false)
    return MyViewHolder(v)
}



override fun onBindViewHolder(holder: MydAdapter.MyViewHolder, position: Int) {
    holder.bindItems(mListMy[position])
}

}

答案 2 :(得分:0)

您可以在构造函数中初始化列表,请看下面的行:

bool find( char * str, char * word )
{
    int i,j,k,l;
    i = strlen( str );
    k = strlen( word ); 
    l = 0;
    while ( i >= k )
    {
        j = 0;
        while ( *(str+j+l) == *(word+j) )
        {
            j++;
        }
        i--; l++;
        if ( j >= k )
        {
            return true;
        }
    }
    return false;
}

这样,您可以在不初始化列表的情况下调用适配器,因为它已经使用默认值(空列表)进行了初始化。