Kotlin上需要ViewHolder getter / setter中的对象

时间:2019-02-24 17:28:21

标签: java android kotlin android-recyclerview

不确定发生了什么。这在Java中工作正常,但是当切换到Kotlin时,我真的不知道如何使它工作。我得到这个错误 但是我得到了同样的错误

class SquareViewHolder(v: CardView, viewModel: BarreViewModel) : RecyclerView.ViewHolder (v) { val mImage: ImageView val by lazy mMoment: Moment init { mImage = v.findViewById(R.id.square_moment) mImage.setOnClickListener { //val focused = ArrayList<Moment>(0) //focused.add(mMoment) //viewModel.focusedMoments = focused //viewModel.setItemClicked(true) } } fun bind(moment: Moment) { val mMoment = moment } } 在val mMoment上:Moment

var lateinit mMoment: Moment

我也尝试过 public class SquareMomentViewHolder extends RecyclerView.ViewHolder { public ImageView mImage; public Moment mMoment; BarreChatViewModel viewModel; public SquareMomentViewHolder(CardView v, BarreChatViewModel viewModel) { super(v); mImage = v.findViewById(R.id.square_moment); mImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { List<Moment> focused = new ArrayList(0); focused.add(mMoment); viewModel.setFocusedMoments(focused); viewModel.setItemClicked(true); } }); } public void bind(Moment moment) { mMoment = moment; } } 但是我收到同样的错误。

现在,此刻对象是Kotlin数据对象,我不确定是否会引起问题。

这在Java上有效,但是由于某种原因,kotlin似乎不喜欢这种方式的对象实例化。我不知道为什么感谢您的帮助!

在Java中是:

{{1}}

此错误的可能原因可能是该数据类用于我的ROOMDatabase。这是我拖到用户界面的实体对象。也许这不是做事的正确方法。我不知道。

1 个答案:

答案 0 :(得分:0)

懒惰是仅在使用变量时才对其进行初始化的地方,但是在将其声明为懒惰时需要一些代码。

例如 val mMoment by lazy { // Some code that generates this }

由于您的变量将在绑定中初始化,因此您应该这样做:

lateinit var mMoment: Moment

这意味着它将在以后初始化。如果尝试不初始化就使用它,则程序将引发异常。

或者,如果这可能永远不会受到约束,则应将其初始化为可为空的值:

var mMoment: Moment? = null