Я не мог найти подобные ответы здесь, но здесь идет речь: я реализовал ListView
, который содержится внутри ViewPager2
представления. ListView получает данные из автономной базы данных, которая хранится в папке ресурсов моего проекта, поэтому после переключения между различными позициями ViewPager2. У меня также есть переключатель, который при переключении будет показывать или скрывать некоторые элементы в списке. У меня 2 проблемы:
- Когда я прокручиваю на другую страницу, иногда элементам требуется некоторое время для обновления значений. Я использую
viewPager.registerOnPageChangeCallback()
, чтобы обновить значения с помощью listViewAdapter!!.notifyDataSetChanged()
. - . При нажатии на переключатель listView на текущей странице не обновляется. Когда я прокручиваю к следующему или предыдущему, он обновляется, но мне нужно, чтобы он обновлялся немедленно при переключении переключателя.
Вот весь соответствующий код:
viewPager.registerOnPageChangeCallback()
в onCreate()
в MainActivity
:
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels)
viewOffset = viewPager.currentItem - beginningPos
todayIs()
// adapter!!.updateValues()
pageAdapter.listAdapterHelper.notifyDataSetChanged()
listViewAdapter!!.notifyDataSetChanged()
lastPos = position
lastOffset = positionOffset
}
})
переключение слушателя в onCreate()
в MainActivity
:
switch.setOnCheckedChangeListener { buttonView, isChecked ->
pageAdapter.notifyDataSetChanged()
listViewAdapter!!.notifyDataSetChanged()
}
Как видите, использование notifyDataSetChanged()
как для listViewAdapter
, так и для viewPagerAdapter
не работает.
классы viewPager2:
class ViewPagerFragment(var fragmentActivity: FragmentActivity) : Fragment() {
var listView : ListView? = null
var listViewAdapterHelper : ListAdapterHelper? = null
var switch : Switch? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View = inflater.inflate(R.layout.view_pager_layout, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
listView = view.findViewById(R.id.list_view)
listViewAdapterHelper = ListAdapterHelper(context!!, fragmentActivity)
listView!!.adapter = listViewAdapterHelper
}
}
val pages = 365
class ViewPagerAdapter(
var fa: FragmentActivity,
var listAdapterHelper: ListAdapterHelper,
var viewPager2: ViewPager2,
var switch: Switch
) : FragmentStateAdapter(fa) {
override fun getItem
Count(): Int = pages
override fun createFragment(position: Int): Fragment {
return ViewPagerFragment(fa)
}
}
class ListAdapterHelper(var context: Context, var fr: FragmentActivity) : BaseAdapter() {
var db = DatabaseUtility(context, mainTimes)
var timeMap = db.getAllTimes(viewOffset)
var switch: Switch = fr.findViewById<Switch>(R.id.switch)
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var convertView = convertView
if (convertView == null) {
val layoutInflater =
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
convertView = layoutInflater.inflate(R.layout.times_list_view, null)
}
timeMap = db.getAllTimes(viewOffset)
var timeMap = timeMap.toMutableMap()
timeMap.remove("Date")
val title = convertView!!.findViewById<TextView>(R.id.Title)
val time = convertView.findViewById<TextView>(R.id.Time)
title.text = allTimesList[position]
time.text = timeMap[timeMap.keys.toList()[position]]
if(switch.isChecked) {
time.visibility = View.VISIBLE
title.visibility = View.VISIBLE
if(title.text == "condition") {
title.setTextAppearance(R.style.Title)
title.setPadding(20, 3, 20, 35)
time.setTextAppearance(R.style.Title_Timing)
time.setPadding(20, 3, 20, 35)
}
else {
title.setTextAppearance(R.style.Title_Style)
title.setPadding(20)
time.setTextAppearance(R.style.Timing_Style)
time.setPadding(20)
}
}
else {
if(title.text == "condition") {
title.visibility = View.GONE
time.visibility = View.GONE
}
else {
time.visibility = View.VISIBLE
title.visibility = View.VISIBLE
}
}
return convertView
}
override fun getItem(position: Int): Any {
return allTimesList[position]
}
override fun isEnabled(position: Int): Boolean {
return false
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getCount(): Int {
return allTimesList.size
}
}
Будем благодарны за любые рекомендации. Есть ли другой способ, которым я должен это делать?