Обновление значений listView внутри viewPager2 вызвано переключением представления? - PullRequest
0 голосов
/ 19 апреля 2020

Я не мог найти подобные ответы здесь, но здесь идет речь: я реализовал ListView, который содержится внутри ViewPager2 представления. ListView получает данные из автономной базы данных, которая хранится в папке ресурсов моего проекта, поэтому после переключения между различными позициями ViewPager2. У меня также есть переключатель, который при переключении будет показывать или скрывать некоторые элементы в списке. У меня 2 проблемы:

  1. Когда я прокручиваю на другую страницу, иногда элементам требуется некоторое время для обновления значений. Я использую viewPager.registerOnPageChangeCallback(), чтобы обновить значения с помощью listViewAdapter!!.notifyDataSetChanged().
  2. . При нажатии на переключатель 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
    }
}

Будем благодарны за любые рекомендации. Есть ли другой способ, которым я должен это делать?

...