填充ListView缓慢,片段无法顺利加载

问题描述 投票:2回答:1

所以我正在使用AndroidStudio,并在Kotlin中编写代码。我有一个带有TabLayout和具有5个选项卡的ViewPager的片段。每个选项卡都包含另一个带有ListView和ToggleButton的片段。 ListViews全部包含10个项目。Here is a screenshot, I'm not allowed to use embed images yet

问题是片段无法顺利打开,尤其是第一次打开时。

我认为问题出在5个选项卡中的ListViews的ListViewAdapter实现中,尤其是getView函数。这是他们的代码:

    inner class TimetableListAdapter(
        private val _context : Context,
        private var fulldata : TimetableUtility.TimetableDay,
        var bWeek : Boolean,
        private var dayData : ArrayList<TimetableUtility.TimetableSubject> = fulldata[0],
        private val _resource : Int = R.layout.timetable_subject_element
    ) : ArrayAdapter<TimetableUtility.TimetableSubject>(_context, _resource, dayData){

        init {
            dayData = if(bWeek){
                fulldata[1]
            }else{
                fulldata[0]
            }
            Log.d("Timetable" , "Adapter init ")
        }

        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {

            Log.d("Timetable" , "getView: $bWeek")

            val s : TimetableUtility.TimetableSubject = if(bWeek){
                dayData = fulldata[1]
                fulldata[1][position]
            }else{
                dayData = fulldata[0]
                fulldata[0][position]
            }

            val v =
                convertView
                    ?: LayoutInflater.from(_context).inflate(
                        _resource,
                        parent,
                        false
                    )

            v.editIcon.setOnClickListener {
                openEditDialog([email protected]!!,s)
            }

            v.timetable_hour_number.text = (position + 1).toString()
            v.timetable_subject_title.text = s.name
            v.timetable_subject_room.text = s.room

            return v
        }
    }

我知道ViewHolder模式的实现将减少视图搜索调用的次数,但是我认为这不会影响初始生成。

我在AndroidStudio中使用Profiler玩了一点,发现,在PC上的虚拟机上运行应用程序时,适配器的getView方法大约需要20-30毫秒。在我的Samsung设备(Galaxy A6,不是旧版本)上运行该应用程序时,它会增加延迟时间。我尚未将其与探查器一起使用。

我的假设是,滞后是由正确的getView方法引起的,如果是,那么您是否有任何建议或想法来改善此问题?

如果有帮助,这是ViewPager适配器的代码:

    inner class TimetableFragmentAdapter(
        context : Context,
        fm : FragmentManager,
        private val totalTabs : Int
    ) : FragmentPagerAdapter(fm,totalTabs){

        private val dayTitles = arrayOfNulls<String>(5)
        private var sdf =
            SimpleDateFormat("EEE", Locale.getDefault())
        private var calendar = Calendar.getInstance()!!

        init{
            for (i in 0..4) {
                calendar.set(Calendar.DAY_OF_WEEK, i + 2)
                dayTitles[i] = sdf.format(calendar.time)
            }
        }

        override fun getCount(): Int {
            return totalTabs
        }

        override fun getPageTitle(position: Int): CharSequence? {
            return dayTitles[position]
        }

        @RequiresApi(Build.VERSION_CODES.O)
        override fun getItem(position: Int): Fragment {
            when(position){
                0 -> return TimetableDayFragment(DayOfWeek.MONDAY, this@TimetableFragment)
                1 -> return TimetableDayFragment(DayOfWeek.TUESDAY, this@TimetableFragment)
                2 -> return TimetableDayFragment(DayOfWeek.WEDNESDAY, this@TimetableFragment)
                3 -> return TimetableDayFragment(DayOfWeek.THURSDAY, this@TimetableFragment)
                4 -> return TimetableDayFragment(DayOfWeek.FRIDAY, this@TimetableFragment)
            }
            return TimetableDayFragment(DayOfWeek.MONDAY, this@TimetableFragment)
        }

以及每个选项卡使用的内部片段的创建代码

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.timetable_inner_fragment,container,false)

        adapter = TimetableListAdapter(context!!, TimetableUtility.timetable.get(day), root.weekSwitch.isChecked)
        root.timetable_list.adapter = adapter

        root.weekSwitch.setOnCheckedChangeListener{
                it, selected ->
            (root.timetable_list.adapter as TimetableListAdapter).bWeek = selected
            (root.timetable_list.adapter as TimetableListAdapter).notifyDataSetChanged()
        }

        return root
    }

非常感谢您的帮助和想法。如果您需要更多代码或信息,请告诉我。

android listview android-fragments layout layout-inflater
1个回答
0
投票

在您的TimetableFragmentAdapter中覆盖destroyItem()

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// destroy your fragment view here
}
© www.soinside.com 2019 - 2024. All rights reserved.