Вызов метода из фрагмента в адаптере RecyclerView — свойство Lateinit TextView не было инициализировано

#kotlin #variables #android-fragments #android-recyclerview #initializing

Вопрос:

У меня есть список предметов. Когда я провожу пальцем по элементу, я хочу обновить текстовое представление во фрагменте.

Я использую RecyclerView. В адаптере я обнаруживаю, когда пользователь что-то пролистывает, а затем пытаюсь вызвать метод во Фрагменте для обновления текстового представления.

Однако, когда я пытаюсь это происходит сбой с «LateInit недвижимости виджет TextView, не был инициализирован». Я пробовал инициализация текстового представления в адаптере, но я не думаю, что это правильно, и это кажется невозможным, как команду findViewById не работает в адаптер с конкретными виджет TextView, не на элемент компоновки, но вместо этого отображается во фрагменте макета (и он должен быть так как я не хочу, чтобы текстовое представление на каждый предмет).

Мой адаптер (упрощенный)

 class SwipeAdapter internal constructor(private val mCandidatesArrayList: ArrayListlt;SwipeCandidategt;) : RecyclerView.Adapterlt;RecyclerView.ViewHoldergt;() {  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  } }  

Ответ №1:

Вы пытаетесь получить представление из фрагмента, который не открыт. В нашем фрагменте, как я понимаю, адаптер инициализирован, вам нужно передать в него прослушиватель, который будет вызван после свайпа.

 class SwipeAdapter internal constructor(var onSwiped: (position: Int) -gt; Unit = { }, private val mCandidatesArrayList: ArrayListlt;Stringgt;) : RecyclerView.Adapterlt;RecyclerView.ViewHoldergt;() {   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 -gt;  textView.setText("Hello")   }, arrayListOf())  } }  

Комментарии:

1. Спасибо! Это сработало как заклинание.