繁体   English   中英

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

[英]Isuues after converting project from java to kotlin

Hello there after a long time thinking about converting my project from java to kotlin, today I shift from java to kotlin, and as expected and warned by the community that the project will not magically just transfer everything easily to kotlin, there are errors now

好的,我只是说清楚我是 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 安全变量末尾的运算符,初始化为 null。

例子。

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

有关更多信息,您可以查看此链接Null 安全 Kotlin

在 kotlin 中,static 变量(只能使用 class 名称访问)位于配套的 ZA8CFDE63311BD59EB2AC9C4B8 块下

   companion object{
    //your variables here
    }

当您在同一个 class 中使用 mUploads 时,您不需要使用 class 名称访问它。 利用

mUploads.get(position)

代替

Companion.mUploads.get(position)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM