繁体   English   中英

回收站视图中的弹出窗口

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM