您好,在考慮將我的專案從 java 轉換為 kotlin 很久之后,今天我從 java 轉換為 kotlin ,正如預期和社區警告的那樣,該專案不會神奇地將所有內容輕松地轉移到 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 配接器類中,我有
public static List<Upload> mUploads;
但現在在 kotlin 中轉換后,我面臨著 mUploads 的問題,例如在這條線上
val uploadCurrent: Upload = Companion.mUploads.get(position)
在 mUploads 上出現錯誤,它顯示未決議的參考:mUploads
舊的 Java 配接器類代碼
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
}
uj5u.com熱心網友回復:
之所以會這樣,是因為在 kotlin 中,有 ** 兩種方法可以宣告變數。
使用lateinit關鍵字:無需在宣告時初始化。
使用null作為變數的初始值。
因此,當您將 java 檔案轉換為 kotlin 時,它可能已將您的值初始化為null 因此您可以添加 !! 或者?初始化為 null 的 null 安全變數末尾的運算子。
例子。
postRecyclerView!!.setLayoutManager(
staggeredGridLayoutManager
)
postRecyclerView!!.addOnScrollListener
有關更多資訊,您可以查看此鏈接 Null Safety Kotlin
在 kotlin 中,靜態變數(只能通過類名訪問)位于伴隨物件塊下
companion object{
//your variables here
}
當您在同一個類中使用 mUploads 時,您不需要使用類名訪問它。用
mUploads.get(position)
代替
Companion.mUploads.get(position)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/363583.html
下一篇:確定實際日歷日期(天)
