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