【发布时间】: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