[英]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.