Android 使用正确的上下文

Android 使用正确的上下文,android,kotlin,android-context,Android,Kotlin,Android Context,需要在SwipeToDeleteCallback中的我的构造函数中粘贴上下文,它位于片段中: private val swipeHandler = object : SwipeToDeleteCallback() { override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { presenter.removeListItem(viewHolder.adapterPosition

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

private val swipeHandler = object : SwipeToDeleteCallback() {

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        presenter.removeListItem(viewHolder.adapterPosition)
    }
}
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)
    }
}
试图插入
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())
}
以下是我的片段的完整代码:

private val swipeHandler = object : SwipeToDeleteCallback() {

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        presenter.removeListItem(viewHolder.adapterPosition)
    }
}
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)
    }
}
你可以用

yourViewHolder.itemView.context
获取
yourViewHolder的上下文


OP澄清后:


起初我以为您只想从您的视图持有者那里获取上下文,但我的回答中有一个补充:

尝试将需要上下文的代码从文档中移动到必须覆盖的
onAttach

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

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

override fun onAttach(context: Context) {
    super.onAttach(context)
}
您可以安全地将所有需要上下文的代码移动到此方法中,并根据需要将其分配给您可以使用的

yourViewHolder.itemView.context
获取
yourViewHolder的上下文


OP澄清后:


起初我以为您只想从您的视图持有者那里获取上下文,但我的回答中有一个补充:

尝试将需要上下文的代码从文档中移动到必须覆盖的
onAttach

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

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

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

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

您是否可以共享
SwipeToDeleteCallback的代码
?请提供更多上下文。你在哪里打电话。在Activity或Fragment中,使用哪种方法?假设您在
Fragment
中,如果
SwipeToDeleteCallback
必须在其构造函数中具有
上下文
,则至少在
onAttach()之前,您无法实例化
。使用惰性委托包装此构造函数。请尝试
viewHolder.itemView.context
是否可以共享
SwipeToDeleteCallback
的代码?请提供更多上下文。你在哪里打电话。在Activity或Fragment中,使用哪种方法?假设您处于
片段中,如果
SwipeToDeleteCallback
必须在其构造函数中具有
上下文
,则至少在
onAttach()
之前无法实例化。请使用惰性委托包装此构造函数。尝试
viewHolder.itemView.Context