Ami*_*mir 9 android kotlin android-viewpager2
我正在使用 ViewPager2、Kotlin 和 AndroidX。当适配器不在索引 0 处并且我更改适配器列表并将当前项设置为索引 0 时,将引发异常。
java.lang.IllegalStateException: Design assumption violated.
at androidx.viewpager2.widget.ViewPager2.updateCurrentItem(ViewPager2.java:538)
at androidx.viewpager2.widget.ViewPager2$4.onAnimationsFinished(ViewPager2.java:518)
at androidx.recyclerview.widget.RecyclerView$ItemAnimator.isRunning(RecyclerView.java:13244)
at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:515)
at android.view.View.layout(View.java:15596)
Run Code Online (Sandbox Code Playgroud)
在 ViewPager2 的第 537 行中有一个 if 导致异常:
// Extra checks verifying assumptions
// TODO: remove after testing
View snapView1 = mPagerSnapHelper.findSnapView(mLayoutManager);
View snapView2 = mLayoutManager.findViewByPosition(snapPosition);
if (snapView1 != snapView2) {
throw new IllegalStateException("Design assumption violated.");
}
Run Code Online (Sandbox Code Playgroud)
这是我更新适配器列表的方式:
adapter.list = newList
adapter.notifyDataSetChanged()
viewpager.setCurrentItem(0, true)
Run Code Online (Sandbox Code Playgroud)
它仅在smoothScroll设置为时发生true
我错过了什么?
编辑:
我使用androidx.viewpager2.widget.ViewPager2可用com.google.android.material:material:1.1.0-alpha08
我在配置更改时遇到了与ViewPager2相同的问题。我正在使用:
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.viewpager2:viewpager2:1.0.0-beta03'
Run Code Online (Sandbox Code Playgroud)
就我而言,我已经覆盖了FragmentStateAdapter类中的getItemId()方法。当我摆脱我的方法时,“ IllegalStateException:违反设计假设”错误不再存在!:-)getItemId()
我正在使用 androidx.viewpager2:viewpager2:1.0.0
对于仍然坚持这一点并且需要实施getItemId() containsItem(). 请您赤getItemId()和containsItem()实施。我的问题是当我提供 10 个项目并且可能有几个项目具有相同的值时,会发生此错误。
媒体具有多个具有相同值的数据。
private var mediaId = media.map { it.hashCode().toLong() }
override fun getItemId(position: Int): Long = mediaId[position]
override fun containsItem(itemId: Long): Boolean = mediaId.contains(itemId)
Run Code Online (Sandbox Code Playgroud)
当您更新数据或什至只是简单地滑动时,viewpager 会混淆,因为您getItemId()使用非唯一 id 实现。解决方案是确保您的数据是唯一的或有自己的 id。*我的媒体数据没有ID。
如果打开执行
getItemId()注释这部分:
- @return 稳定的项目 ID {@link RecyclerView.Adapter#hasStableIds()}
您需要为每个项目都有唯一的 ID。
| 归档时间: |
|
| 查看次数: |
3214 次 |
| 最近记录: |