从 RecyclerView Adapter 中的 Fragment 调用方法 - Lateinit 属性 textView 尚未初始化

Calling method from Fragment in RecyclerView Adapter - Lateinit property textView has not been initialized

我有一个物品清单。当我在项目上滑动时,我想更新 Fragment 中的 textView。

我使用 RecyclerView。在 Adapter 中,我检测到用户何时滑动某些东西,然后我尝试调用 Fragment 中的方法来更新 textview。

但是,当我尝试它时,它因 “LateInit 属性 TextView 尚未初始化”而崩溃。 我尝试在适配器中初始化 textView,但我不认为这是正确的,而且似乎不可能,因为 findViewById 在适配器中并没有真正起作用,因为特定的 TextView 不在项目布局上,而是显示在片段布局中(它需要像我那样显示)不想在每个项目上都有文本视图)。

我的适配器(简体)

class SwipeAdapter internal constructor(private val mCandidatesArrayList: ArrayList<SwipeCandidate>) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {

private val mSwipeFragment = SwipeFragment() //Here I initialize my fragment

fun createHelperCallback(): ItemTouchHelper.Callback {
    return object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
        override fun onMove(
            recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean {
            return false
        }

        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, swipeDir: Int) {
            val position = viewHolder.bindingAdapterPosition
            mSwipeFragment.updateTextView() //This throws the error
        }
      }
   }
}

}

我的片段(简体):

class SwipeFragment : Fragment() {
         private lateinit var textView : TextView


         override fun onCreateView(
              inflater: LayoutInflater,
              container: ViewGroup?,
              savedInstanceState: Bundle?
              ): View {

              textView = root.findViewById(R.id.textview) //initializing textview

        }

        fun updateTextView() { 
             textView.setText("Hello") //Setting the text
        }
}

您正在尝试从未打开的片段中获取视图。在我们的片段中,据我了解,适配器是初始化的,你需要将一个监听器传递给它,它将在滑动后调用。

class SwipeAdapter internal constructor(var onSwiped: (position: Int) -> Unit = { }, private val mCandidatesArrayList: ArrayList<String>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    fun createHelperCallback(): ItemTouchHelper.Callback {
        return object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
            override fun onMove(
                    recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder,
                    target: RecyclerView.ViewHolder,
            ): Boolean {
                return false
            }

            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, swipeDir: Int) {
                val position = viewHolder.bindingAdapterPosition
                onSwiped(position)
            }
        }
    }
}

片段

class SwipeFragment : Fragment() {
    private lateinit var textView: TextView


    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?,
    ): View {

        textView = root.findViewById(R.id.textview)

        val adapter = SwipeAdapter({ position: Int ->
            textView.setText("Hello") 
        }, arrayListOf())
    }
}