我有一个包含显示 N 个片段的 ViewPager 的 Activity。每个片段都在我的 ViewPager 的自定义适配器(扩展FragmentStatePagerAdapter
)中显示来自 ArrayList 的对象的属性。
该片段(除其他外)有一个按钮,该按钮应该删除当前显示的片段并滚动到下一个片段,setCurrentItem(position, true)
这样如果用户向后滚动,前一个项目就会消失。我通过使用这样的东西(简化)来做到这一点:
deleteButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyActivity parentActivity = (MyActivity)getActivity();
// First, scroll to next item (smoothly)
parentActivity.pager.setCurrentItem(parentActivity.pager.getCurrentItem()+1, true);
// Database stuff...
doSomeDBOperations();
// Method in Activity that removes the current object (I believe this method is working fine and yes, it calls notifyDataSetChanged())
parent.removeObject(currentObject);
}
});
这具有所需的行为,因为由其删除按钮被按下的片段表示的对象被删除,并且 viewpager 转到下一页。
我的问题是 ViewPager 滚动不顺畅,而是“立即跳转”到下一个片段。如果我对removeObject()
通话进行评论,则平滑滚动会起作用(但不会删除该项目)。我相信这与removeObject()
在 setCurrentItem() 完成平滑滚动动画之前被调用有关吗?
关于如何解决这个问题并实现项目移除+平滑滚动的任何想法?如果我的假设是正确的,我如何确保在移除对象之前完成平滑滚动?
编辑1:
我的假设似乎是正确的。如果我把parent.removeObject(currentObject)
里面
// ...inside the previously shown public void onClick(View v)...
confirm.postDelayed(new Runnable() {
@Override
public void run() {
// Method in Activity that removes the current object (I believe this method is working fine and yes, it calls notifyDataSetChanged())
parent.removeObject(currentObject);
}
}, 1000);
以便removeObject()
呼叫等待一秒钟,它按预期工作:滚动到下一项,删除上一项。但这是一个非常丑陋的解决方法,所以我仍然想要一个更好的方法。
编辑2:
我想出了一个可能的解决方案(见下文)。