【问题标题】:Popup inside a recycler View回收站视图中的弹出窗口
【发布时间】:2021-05-30 13:53:47
【问题描述】:

我需要帮助,因为我长期面临一个问题,但我无法解决...当我点击一个按钮时,我收到此错误消息并且我的应用程序崩溃:

 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()
        }

如果您需要更多信息,我可以给您,感谢您的帮助!

【问题讨论】:

  • 能否请您提供完整的适配器代码。?似乎有些东西是null 很可能是itemViewadapter.context
  • 完成了@MayurGajra,我的ChooserActivity确实存在
  • 给定的代码对我来说效果很好。在项目上单击我会正确显示一个对话框。它到底在哪里崩溃?你想开始一些活动吗?点击哪个按钮会崩溃?
  • 我认为不起作用是因为我的活动在导航栏中,所以我不确定它是否利用了我的选择器活动,但只有我的选择器片段? @MayurGajra
  • 其实,我是在问,从给定的代码中,您能否指出导致错误的代码行或单击?因为它对我很有效。

标签: android kotlin popup


【解决方案1】:

在需要上下文的任何地方使用&lt;YourActivity&gt;.this。我怀疑初始化适配器时上下文为空。

【讨论】:

    【解决方案2】:

    我不完全确定您为什么要将整个适配器传递给您的对话框,以使对话框膨胀,您只需要可以在不提供整个适配器的情况下提供的上下文。

    其次,我觉得如果你将扩展对话框的代码分离到你的活动中会更好,因为它应该属于你可以使用界面的地方。

    以下是我将推荐的更改。

    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 MusclePopup(
            private val context: Context,
            private val currentItem: ChoosersModel
    ) : Dialog(context)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2013-01-06
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多