【问题标题】:Use right context使用正确的上下文
【发布时间】:2019-09-12 09:52:23
【问题描述】:

需要在我的构造函数中粘贴上下文SwipeToDeleteCallback,它位于片段中:

private val swipeHandler = object : SwipeToDeleteCallback() {

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        presenter.removeListItem(viewHolder.adapterPosition)
    }
}

尝试插入 requireContext() 但捕获 KotlinNullPointerException。

也许我可以以某种方式在这里使用上下文viewHolder.context

这是一些代码SwipeToDeleteCallback

abstract class SwipeToDeleteCallback(context: Context) :
    ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {

    private val deleteIcon = context.getDrawableCompat(R.drawable.ic_log_out)

我也从MainActivity 调用了我的片段:

override fun onPostResume() {
    super.onPostResume()
    replaceFragment(TargetsFragment())
}

override fun showListOfTarget() {
    replaceFragment(TargetsFragment())
}

这是我的片段的完整代码:

class TargetsFragment : Fragment(), ListItemClickListener, SelectTargetViewContract, BaseDataSetContract {

    private var recyclerView: RecyclerView? = null
    private val presenter = TargetsPresenter(this)
    private var adapter = TargetsAdapter(clickListener = this)

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_target_list, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        presenter.setInitialData()
        setupViews()
        updateListData()
    }

    override fun onListItemClick(itemIndex: Int, itemCode: String) {
        presenter.onListItemClick((adapter.getItem(itemIndex) as Target).guid)
    }

    override fun showTarget(guid: String) {
        activity?.addFragment(TargetEditFragment.newInstance(guid))
    }

    override fun dataSetChanged() {
        updateListData()
        adapter.notifyDataSetChanged()
    }

    override fun updateViewContent() {
        adapter.data = presenter.targetList
        recyclerView?.adapter = adapter
        recyclerView?.setVisible(presenter.shouldShowContent())
        emptyView?.setVisible(presenter.shouldShowEmptyView())
    }

    private fun updateListData() {
        if (presenter.firebaseUser == null) {
            Log.d("some", "loadLogInView")
        } else {
            presenter.getTargetsFromDb()
        }
    }

    private val swipeHandler = object : SwipeToDeleteCallback() {

        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
            presenter.removeListItem(viewHolder.adapterPosition)
        }
    }

    private fun setupViews() {
        recyclerView = view?.findViewById(R.id.recyclerView)
        recyclerView?.layoutManager = LinearLayoutManager(activity)
        ItemTouchHelper(swipeHandler).attachToRecyclerView(recyclerView)
    }
}

【问题讨论】:

  • 您能分享一下SwipeToDeleteCallback 的代码吗?
  • 您能否提供更多背景信息。你在哪里打电话。在Activity或Fragment中,在哪个方法中?
  • 假设您在Fragment 中,如果SwipeToDeleteCallback 的构造函数中必须有Context,那么您至少要到onAttach() 才能实例化。
  • 用惰性委托包装这个构造函数。
  • 试试viewHolder.itemView.context

标签: android kotlin android-context


【解决方案1】:

你可以使用

yourViewHolder.itemView.context

获取yourViewHolder的上下文


在 OP 澄清后:


最初我以为您只想从 ViewHolder 中获取上下文,但这是对我的回答的补充:

尝试将需要上下文的代码从文档中移至 onAttach,您必须将其覆盖:https://developer.android.com/guide/components/fragments.html

注意:如果您需要在 Fragment 中包含 Context 对象,您可以调用 getContext()。但是,请注意仅当片段附加到活动时才调用 getContext()。当片段尚未附加或在其生命周期结束时被分离时,getContext() 返回 null。

您要查找的方法如下所示:

override fun onAttach(context: Context) {
    super.onAttach(context)
}

您可能会安全地在此方法中移动所有需要上下文的代码并根据需要分配它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多