[英]Popup inside a recycler View
我需要帮助,因为我长期面临一个问题并且我无法解决它......我有这个错误消息并且当我点击一个按钮时我的应用程序崩溃:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
at android.app.Activity.startActivityForResult(Activity.java:5251)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:675)
at android.app.Activity.startActivityForResult(Activity.java:5208)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:662)
at android.app.Activity.startActivity(Activity.java:5579)
at androidx.core.content.ContextCompat.startActivity(ContextCompat.java:251)
at fr.amseu.mystretching.adapter.ChooserAdapter$onBindViewHolder$1.onClick(ChooserAdapter.kt:38)
at android.view.View.performClick(View.java:7870)
at android.view.View.performClickInternal(View.java:7839)
at android.view.View.access$3600(View.java:886)
at android.view.View$PerformClick.run(View.java:29363)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7948)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
发生的事情是我在导航栏中有一个项目的回收站视图。 我希望当我们单击一个项目时,它会打开一个弹出窗口。 但是使用我的代码,当我单击它时,会出现上面的代码。 这是我的弹出活动(我已经简化以找到问题):
class MusclePopup(
private val adapter: ChooserAdapter,
private val currentItem: ChoosersModel
) : Dialog(adapter.context) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.fragment_popup)
setupComponents()
}
private fun setupComponents() {
findViewById<TextView>(R.id.input_chooser).text = currentItem.description
}
}
这是我的适配器活动,与我的点击项目的回收者视图相同:
class ChooserAdapter(
val context: ChooserActivity,
private val ChooseList: ArrayList<ChoosersModel>)
:RecyclerView.Adapter<ChooserAdapter.ViewHolder>(){
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
var chooserNumber: TextView = view.findViewById(R.id.item_number)
var chooserDescription: TextView = view.findViewById(R.id.item_description)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_chooser, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val currentItem = ChooseList[position]
holder.chooserNumber.text = currentItem.number
holder.chooserDescription.text = currentItem.description
holder.itemView.setOnClickListener {
MusclePopup(this, currentItem).show()
}
}
override fun getItemCount(): Int = ChooseList.size
}
通过我的测试,我认为错误来自这一行:
holder.itemView.setOnClickListener {
MusclePopup(this, currentItem).show()
}
如果您需要更多信息,我可以给您,感谢您的帮助!
在需要上下文的任何地方使用<YourActivity>.this
。 我怀疑初始化适配器时上下文是 null 。
我不确定为什么要将整个适配器传递给对话框,以使对话框膨胀,您只需要可以在不提供整个适配器的情况下提供的上下文。
其次,我觉得如果您将扩展对话框的代码分离到您的活动中会更好,因为它应该属于您可以使用界面的地方。
以下是我将推荐的更改。
ChooserAdapter.kt
现在如下
class ChooserAdapter(
private val chooserAdapterCallback: ChooserAdapterCallback,
private val ChooseList: ArrayList<ChoosersModel>)
:RecyclerView.Adapter<ChooserAdapter.ViewHolder>(){
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
var chooserNumber: TextView = view.findViewById(R.id.item_number)
var chooserDescription: TextView = view.findViewById(R.id.item_description)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_chooser, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val currentItem = ChooseList[position]
holder.chooserNumber.text = currentItem.number
holder.chooserDescription.text = currentItem.description
holder.itemView.setOnClickListener {
chooserAdapterCallback.onChooseAdapterClick(currentItem)
}
}
override fun getItemCount(): Int = ChooseList.size
interface ChooserAdapterCallback{
fun onChooseAdapterClick(currentItem: ChoosersModel)
}
}
接下来,在您的ChooserActivity
中,您必须实现接口,大致如下。 此外,您将需要修改您的适配器初始化并将其大致传递给ChooserAdapter(this, chooseList)
class ChooserActivity : AppCompatActivity(), ChooserAdapter.ChooserAdapterCallback {
override fun onChooseAdapterClick(currentItem: ChoosersModel) {
MusclePopup(this, currentItem).show()
}
}
接下来,您必须将 MusclePopup class 修改为如下:
class MusclePopup(
private val context: Context,
private val currentItem: ChoosersModel
) : Dialog(context)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.