将项目从 java 转换为 kotlin 后的问题

Isuues after converting project from java to kotlin

你好,在考虑将我的项目从 java 转换为 kotlin 很长时间后,今天我从 java 转换为 kotlin ,并且正如社区所预期和警告的那样,该项目不会神奇地把所有东西轻松地转移到科特林,现在有错误

好的,我只是说清楚我是 kotlin 的初学者,但我对 java

有点熟悉

我注意到几乎所有 java 到 kotlin 文件的转换都存在 1 个主要错误

Smart cast to 'RecyclerView!' is impossible, because 'postRecyclerView' is a mutable property that could have been changed by this time

在 java 中,例如,如果我必须添加滚动侦听器,我就这样做

recyclerview.addOnScrollListner 

但在 kotlin 中出现错误 // 下面的行是 kotlin

postRecyclerView.setLayoutManager(
            staggeredGridLayoutManager
        )

 postRecyclerView.addOnScrollListener 

shimmerFrameLayout.startShimmer()

因为我不太了解kotlin我不知道它是什么

其次,在我的旧 java 适配器 class 中,我有

public static List<Upload> mUploads;

但现在在 kotlin 中转换后,我遇到了 mUploads 问题 例如在这条线上

val uploadCurrent: Upload = Companion.mUploads.get(position)

mUploads 出现错误,显示未解决的参考:mUploads

旧java适配器class代码

PostAdapter_Home.java

public class PostAdapter_Home extends RecyclerView.Adapter<PostAdapter_Home.PostViewHolder> {
    public static List<Upload> mUploads;
    public Context mcontext;

    public PostAdapter_Home(Context context, List<Upload> uploads) {
        mUploads = uploads;
        mcontext = context;
    }


    @NonNull
    @Override
    public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        view = LayoutInflater.from(mcontext).inflate(R.layout.ex_home, parent, false);
        return new PostViewHolder(view);

    }

    @Override
    public void onBindViewHolder(@NonNull PostViewHolder holder, int position) {
        Shimmer shimmer = new Shimmer.ColorHighlightBuilder()
                .setBaseColor(Color.parseColor("#F3F3F3"))
                .setBaseAlpha(1)
                .setHighlightColor(Color.parseColor("#E7E7E7"))
                .setHighlightAlpha(1)
                .setDropoff(50)
                .build();
        ShimmerDrawable shimmerDrawable = new ShimmerDrawable();
        shimmerDrawable.setShimmer(shimmer);
        Upload uploadCurrent = mUploads.get(position);
        Glide.with(mcontext)
                .load(uploadCurrent.getmImageUrl())
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
                .placeholder(shimmerDrawable)
                .centerCrop()
                .fitCenter()
                .into(holder.imageView);

//        holder.imageView.setOnClickListener(view -> changeScaleType(holder, position));

    }


    @Override
    public int getItemCount() {
        return mUploads.size();
    }

    public void setUploads(List<Upload> uploads){
        mUploads=uploads;
    }
    public static class PostViewHolder extends RecyclerView.ViewHolder {

        private final ShapeableImageView imageView;

        public PostViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imagePostHome);

        }


    }
} 

PostAdapter.kt

class PostAdapter     /* ShimmerFrameLayout shimmerFrameLayout; */(
    var mcontext: Context
) : RecyclerView.Adapter<PostAdapter.PostViewHolder>() {
    private var mListener: OnItemClickListener? = null
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder {
        LayoutInflater.from(mcontext).inflate(R.layout.post_item_container_profile, parent, false)
        val view: View = LayoutInflater.from(parent.context)
            .inflate(R.layout.post_item_container_profile, parent, false)
        return PostViewHolder(view)
    }

    override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
        val uploadCurrent: Upload? = mUploads.get(position)
        val shimmer = ColorHighlightBuilder()
            .setBaseColor(Color.parseColor("#F3F3F3"))
            .setBaseAlpha(1f)
            .setHighlightColor(Color.parseColor("#E7E7E7"))
            .setHighlightAlpha(1f)
            .setDropoff(50f)
            .build()
        val shimmerDrawable = ShimmerDrawable()
        shimmerDrawable.setShimmer(shimmer)
        Glide.with(mcontext)
            .load(uploadCurrent.getmImageUrl())
            .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
            .placeholder(shimmerDrawable)
            .centerCrop()
            .fitCenter()
            .into(holder.imageView)
    }

    override fun getItemCount(): Int {
        return Companion.mUploads.size
    }

    fun setOnItemClickListener(listener: OnItemClickListener?) {
        mListener = listener
    }

    fun setUploads(uploads: List<Upload>) {
        Companion.mUploads = uploads
    }

    interface OnItemClickListener {
        fun onClick(view: View?)
        fun onItemClick(position: Int)
        fun onDeleteClick(position: Int)
    }

    inner class PostViewHolder internal constructor(itemView: View) :
        RecyclerView.ViewHolder(itemView), View.OnClickListener, OnCreateContextMenuListener,
        MenuItem.OnMenuItemClickListener {
        var imageView: ShapeableImageView
        override fun onClick(v: View) {
            if (mListener != null) {
                val position = adapterPosition
                if (position != RecyclerView.NO_POSITION) {
                    mListener!!.onItemClick(position)
                }
            }
        }

        override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenuInfo) {
            val delete = menu.add(Menu.NONE, 2, 2, "Delete")
            delete.setOnMenuItemClickListener(this)
        }

        override fun onMenuItemClick(item: MenuItem): Boolean {
            if (mListener != null) {
                val position = adapterPosition
                if (position != RecyclerView.NO_POSITION) {
                    if (item.itemId == 2) {
                        mListener!!.onDeleteClick(position)
                        return true
                    }
                }
            }
            return false
        }

        init {
            imageView = itemView.findViewById(R.id.imagePost)
            itemView.setOnClickListener(this)
            itemView.setOnCreateContextMenuListener(this)
        }
    }

    companion object
}

这是因为在 kotlin 中,有**两种声明变量的方法。

使用 lateinit 关键字:声明时无需初始化。

使用 null 作为变量的初始值。

因此,当您将 java 文件转换为 kotlin 时,它可能已使用 null 初始化了您的值 因此,您可以在变量末尾添加 !!? 运算符以确保初始化为 null.

的空安全性

示例。

postRecyclerView!!.setLayoutManager(
            staggeredGridLayoutManager
        )
 postRecyclerView!!.addOnScrollListener

更多你可以查看这个link Null Safety Kotlin

在 kotlin 中,静态变量(只能使用 class 名称访问)在伴随对象块下

   companion object{
    //your variables here
    }

因为您在同一个 class 中使用 mUploads,所以您不需要使用 class 名称访问它。 使用

mUploads.get(position)

而不是

Companion.mUploads.get(position)