Динамический доступ к элементам View внутри ViewPager2
Есть ViewPager2, адаптер - FragmentStateAdapter. ViewPager2 манипулирует однотипными фрагментами, внутри каждого из которых RecyclerView. Внутри RecyclerView - button элементы, состояние которых мне нужно изменять в зависимости от другого процесса. Проблема в том, что их состояние удаётся изменять только у первого и последнего фрагмента, потому что они нужным образом пересоздаются. Те фрагменты, что между ними, один раз создаются и не уничтожаются, и доступа, по каким-то причинам, к их RecyclerView нет.
profileFunctionFragment.fragmentAdapter.apply{
allFunctionsFragment.enabledButton(false, activeFunction) //успешно
friendsFragment.enabledButton(false, activeFunction) //не удается
wallFragment.enabledButton(false, activeFunction) //не удается
groupFragment.enabledButton(false, activeFunction) //не удается
mediaFragment.enabledButton(false, activeFunction) //успешно
Код адаптера:
class ViewPager2Adapter(fragment: Fragment): FragmentStateAdapter(fragment) {
lateinit var allFunctionsFragment: ObjectFragment
lateinit var friendsFragment: ObjectFragment
lateinit var wallFragment: ObjectFragment
lateinit var groupFragment: ObjectFragment
lateinit var mediaFragment: ObjectFragment
override fun getItemCount(): Int = 5
override fun createFragment(position: Int): Fragment {
allFunctionsFragment = ObjectFragment(R.layout.fragment_all_function, R.id.fragment_groups_function, StorageFunctions.listOfFunctionsProfile,
"allFunctionsFragment")
friendsFragment = ObjectFragment(R.layout.fragment_friends, R.id.function_list_friends, StorageFunctions.listOfFunctionsFriends,
"friendsFragment")
wallFragment = ObjectFragment(R.layout.fragment_wall, R.id.function_list_wall, StorageFunctions.listOfFunctionsWall,
"wallFragment")
groupFragment = ObjectFragment(R.layout.fragment_groups, R.id.function_list_groups, StorageFunctions.listOfFunctionsForGroups,
"groupFragment")
mediaFragment = ObjectFragment(R.layout.fragment_media, R.id.function_list_media, StorageFunctions.listOfFunctionsMedia,
"mediaFragment")
lateinit var fragment: ObjectFragment
when(position) {
0 -> {
fragment = allFunctionsFragment
activeFragment = "allFunctionsFragment"
}
1 -> {
fragment = friendsFragment
activeFragment = "friendsFragment"
}
2 -> {
fragment = wallFragment
activeFragment = "wallFragment"
}
3 -> {
fragment = groupFragment
activeFragment = "groupFragment"
}
4 -> {
fragment = mediaFragment
activeFragment = "mediaFragment"
}
}
return fragment
}
}
Код типового фрагмента:
class ObjectFragment(resource: Int, recyclerViewId: Int, data: MutableSet<Function>, tag: String) : Fragment() { //шаблон для всех фрагментов, остальные фрагменты - экземпляры этого класса
var resourceId = resource
var recyclerViewId = recyclerViewId
var data = data
var mTag = tag
var created = false
lateinit var rootView: View
lateinit var buttonList: RecyclerView
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
rootView = inflater.inflate(resourceId, container, false)
initViews()
if (MainActivity.status) enabledButton(false, MainActivity.activeFunction)
else enabledButton(true)
return rootView
}
override fun onDestroy() {
super.onDestroy()
Log.i("infoCreated", "Уничтожен $mTag!!")
}
fun initViews(){
buttonList = rootView.findViewById(recyclerViewId)
buttonList.isNestedScrollingEnabled = false;
buttonList.adapter = FunctionAdapter(context, data)
created = true
Log.i("infoCreated", "Инициализирован $mTag!!")
}
fun enabledButton(enabled: Boolean, textPosition: String = "plug"){
for(i in data){
i.enabledChangeItem = enabled
if (textPosition != i.name)
i.enabled = enabled
i.enabledChangeItem = enabled
}
if (created) buttonList.adapter?.notifyDataSetChanged() //срабатывает только у перв. и посл.
else Log.i("infoCreated", "не создан $mTag")
}
}
Ответы (1 шт):
Проблема была решена созданием фрагментов в другом месте, что повлекло за собой переиспользование одних и тех же фрагментов и своевременный доступ к их View