Kotlin中需要在ViewHolder的getter/setter中使用Object。

3

不确定发生了什么。在Java中可以正常工作,但是当切换到Kotlin时,我不知道如何使其工作。我遇到了以下错误:

需要属性的getter或setter 在 val mMoment: Moment 上

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
    }
}

我也尝试过使用以下代码:

var lateinit mMoment: Moment

但是我收到了相同的错误。

现在,Moment对象是一个Kotlin数据对象,我不确定是否会导致问题。

在Java中,这样实例化对象是有效的,但是出于某种原因,Kotlin似乎不喜欢这种方式。我不知道为什么。感谢任何帮助!

Java代码如下:

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;
}

}

这个错误的可能原因是这个数据类被用于我的ROOMDatabase。这是一个我向用户界面拖动的实体对象。也许这不是一个恰当的做法,我不确定。

欢迎来到StackOverflow!你写道:“在Java中这个工作得很好”- 你可以分享一下你的Java代码吗? - Alex Yu
当然,我刚刚添加了它。谢谢。 - chrisdottel
1个回答

0

Lazy 是一种变量的初始化方式,只有在变量被使用时才会被实例化。不过在声明时需要编写一些代码。

例如:

val mMoment by lazy { // 生成此变量的代码 }

由于您的变量将在绑定中初始化,因此应进行以下操作:

lateinit var mMoment: Moment

这意味着它将在稍后初始化。如果尝试在未初始化之前使用它,则程序将抛出异常。

或者,如果这个变量可能永远不会被绑定,您可以将其初始化为可空值:

var mMoment: Moment? = null


啊,谢谢!奇怪的是,lateinit var mMoment: Moment 没有起作用,但是 var mMoment: Moment? = null 起作用了。我猜它想让我确定声明了某个东西,我不知道。再次感谢! - chrisdottel
@ChristopherDottellis 这是你的问题的解决方案吗? - Alex Yu
没关系。如果您的问题得到解决,请接受答案 :) - TomH
点击答案旁的勾号,按上箭头投票支持它 :) - TomH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接