#android #kotlin #android-recyclerview
#Android #kotlin #android-recyclerview
Вопрос:
Я пытаюсь создать всплывающее окно, в котором пользователь может увидеть Recyclerview (Список комментариев). Но я хочу добавить в него 2 кнопки для увеличения и уменьшения голосов для комментариев.
Я завершил просмотр Recyclerview и его отображение должным образом, как я хочу, но я не могу добавить кнопки в recyclerview. Вот мой код.
Код всплывающего окна из моей активности:
lateinit var getAllcomment : GetAllCommentsAdapter
lateinit var upVote : View.OnClickListener
lateinit var downVote : View.OnClickListener
viewallcomments_txt.setOnClickListener {it->
val layoutInflater = this@ViewSinglePostActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val customView = layoutInflater.inflate(R.layout.popup, null)
val display = windowManager.defaultDisplay
val size = Point()
display.getSize(size)
val popupWindow=PopupWindow(customView, size.x-50, size.y-660, true);
popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
popupWindow.setAnimationStyle(R.style.PopupAnimation)
popupWindow.showAtLocation(linearLayout1, Gravity.CENTER, 0, 0)
popupWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
customView.popup_rcv.layoutManager = LinearLayoutManager(this)
getAllcomment = GetAllCommentsAdapter(ArrayList(), upVote, downVote) // I have declare Adapter all parameter
getMainApp().swiftAPI.getAllComments(post_id).enqueue(object : Callback<ArrayList<Comments>>{
override fun onFailure(call: Call<ArrayList<Comments>>, t: Throwable) {
Toast.makeText(this@ViewSinglePostActivity, t?.message, Toast.LENGTH_SHORT)
}
override fun onResponse(call: Call<ArrayList<Comments>>, response: Response<ArrayList<Comments>>) {
if (response?.isSuccessful!!){
getAllcomment.commentList.addAll(response.body()!!)
customView.popup_rcv.adapter = getAllcomment
getAllcomment.notifyDataSetChanged()
}
}
})
Адаптер GetAllcomments:
class GetAllCommentsAdapter (var commentList: ArrayList<Comments>, val upVote: View.OnClickListener, val downVote: View.OnClickListener) : RecyclerView.Adapter<GetAllCommentsAdapter.ViewHolder>() {
var comment_id = 0
var commentHashMap = HashMap<Int, Int>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.popup_rcv, parent, false)
return ViewHolder(itemView)
}
override fun getItemCount(): Int {
return commentList.count()
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.comment?.setText(commentList.get(position).comment)
holder.username?.setText(commentList.get(position).username)
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var username : TextView ?= null
var comment : TextView ?= null
var upvote : ImageView ?= null
var downvote : ImageView ?= null
init {
this.username = itemView.findViewById(R.id.dialog_cmt_user_txt)
this.comment = itemView.findViewById(R.id.dialog_cmt_txt)
this.upvote = itemView.findViewById(R.id.upvote_comment_img)
this.downvote = itemView.findViewById(R.id.downvote_comment_img)
}
}
Но я получаю эту ошибку, когда открываю всплывающее окно.
не было инициализировано обновление свойства lateinit
Заранее спасибо
Ответ №1:
Это ошибка вашей реализации, обычно вы должны инициализировать var
во время компиляции, но с lateinit
ключевым словом вы пообещали компилятору, что инициализируете его позже, когда ваше приложение будет запущено, и что оно не должно выдавать ошибку во время компиляции, но вы не выполнили это обещание, теперь, когда вы пытаетесь использовать переменную, которую вы никогда не инициализировали, вы получаете исключение.
Таким образом, решением было бы предоставить реализацию для прослушивателей щелчков upVote
и downVote
перед их использованием.
Комментарии:
1. Спасибо, сэр, ваш ответ объяснил мне, где я был неправ.