#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. Спасибо! Это сработало как заклинание.