所以我正在使用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
}
非常感谢您的帮助和想法。如果您需要更多代码或信息,请告诉我。
在您的TimetableFragmentAdapter
中覆盖destroyItem()
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// destroy your fragment view here
}