将项目从 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)
你好,在考虑将我的项目从 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)