如何根据项目的动态数据在视图分页器中跳过页面

时间:2019-05-09 16:19:15

标签: android-viewpager

视图分页器的适配器中有items [](源自FragmentStatePagerAdapter),并且通过滑动将其附加到末尾。商品的数据本身正在动态变化。

在页面上滑动时,如果当时尚不能显示其项目数据,则寻呼机应跳过它并显示下一个。

即item []具有[a,b,c,d,e ...],当它显示c并滑动以显示其左侧时,应该显示b。但是,如果此时b数据尚未准备好显示,则应该显示a。而且,如果从a向后滑动,并且b的数据现在可以显示了,那么它应该显示b

建议here

中执行viewPager.setCurrentItem(newPosition)
override fun onPageSelected(position: Int) 

功能

但是它首先显示b,然后迅速更改为显示a,这不是很好的体验。

另外一个here建议进行检查并在以下位置返回正确的片段:

override fun getItem(position: Int): Fragment {
}

无法在getItem(position: Int)中执行此操作,因为它调用得太早,即,当c显示b已创建用于通过getItem(1)在寻呼机中进行缓存时,但是c可能会显示很长时间,并且b的数据可能已从“可以显示”更改为“无法显示”。

(但是在显示c并跳过不可用的项目以便在寻呼机中进行缓存时,这是可以接受的,因此在这种情况下,可以在getItem(position: Int)中进行缓存。问题仅在于那些滑入寻呼机时,将其从able to show更改为NOT able to show时的数据)

仍然认为更改给定位置的位置并返回不同的片段是不合适的。

还看着this,尝试过:

   override fun getItem(position: Int): Fragment {
      var item = dataList[position]
      var fragment: Fragment? = null

      when (item) {
        is DataItem -> {

            Log.e("+++", "+++ getItem($position), (item is DataItem), call notifyDataSetChanged()")

            notifyDataSetChanged()

            fragment = Data2Fragment(item)
        }
        else -> fragment = ……
    }
    return fragment
}


override fun getItemPosition(fragment: Any): Int {

    Log.e("+++", "+++ enter getItemPosition($fragment)")

    (fragment as? Data2Fragment)?.let {

        if (!fragment.data.isAvailable) {
            return POSITION_NONE
                .also {
                    Log.e("+++", "+++ --- exit ======================== pagerDatapter:getItemPosition($fragment), return position: POSITION_NONE")
                }
        }

    }

    return super.getItemPosition(fragment)  //POSITION_UNCHANGED
        .also {
            Log.e("+++", "+++ --- exit pagerDatapter:getItemPosition($fragment), return position: $it")
        }
}

它会导致无限循环:

+++ getItem(1), (item is DataItem), call notifyDataSetChanged()
+++ enter getItemPosition(DataFragment{58372fe #0 id=0x7f0a00f2})
--- exit pagerDatapter:getItemPosition(DataFragment{58372fe #0 id=0x7f0a00f2}), return position: -1
 +++ enter getItemPosition(DataFragment{1e4f8dc #2 id=0x7f0a00f2})
 +++ --- exit pagerDatapter:getItemPosition(DataFragment{1e4f8dc #2 id=0x7f0a00f2}), return position: -1
 +++ getItem(1), (item is DataItem), call notifyDataSetChanged()
 +++ enter getItemPosition(DataFragment{58372fe #0 id=0x7f0a00f2})
 +++ --- exit pagerDatapter:getItemPosition(DataFragment{58372fe #0 id=0x7f0a00f2}), return position: -1
 +++ enter getItemPosition(DataFragment{1e4f8dc #2 id=0x7f0a00f2})
 +++ --- exit pagerDatapter:getItemPosition(DataFragment{1e4f8dc #2 id=0x7f0a00f2}), return position: -1
 +++ getItem(1), (item is DataItem), call notifyDataSetChanged()
…
…
…  

它不起作用(可能不了解呼叫顺序,或者notifyDataSetChanged()何时导致getItemPosition()被呼叫。

如何基于动态数据跳过页面?

0 个答案:

没有答案