use*_*392 7 android android-fragments android-viewpager fragmentpageradapter
我有一个包含ViewPager的Activity,它显示N个片段.每个片段都在我的ViewPager的自定义适配器(extends 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);
}
});
Run Code Online (Sandbox Code Playgroud)
这具有所需的行为,因为按下删除按钮的片段所代表的对象将被删除,并且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);
Run Code Online (Sandbox Code Playgroud)
这样removeObject()调用等待一秒钟,它按预期工作:滚动到下一个项目,删除前一个.但这是一个非常难看的解决方法,所以我仍然想要一个更好的方法.
编辑2:
我想出了一个可能的解决方案(见下文).
use*_*392 12
我最终压倒了
public void onPageScrollStateChanged(int state)
Run Code Online (Sandbox Code Playgroud)
方法:
每当用户按下片段中的删除按钮时,监听器在当前项中设置一个bool(将其标记为删除)并滚动到下一个.
当onPageScrollStateChanged检测到滚动状态改变为ViewPager.SCROLL_STATE_IDLE(当平滑滚动结束时发生),它检查前一项是否被标记为删除,如果是,则将其从ArrayList中删除并调用notifyDataSetChanged().
通过这样做,我设法让ViewPager顺利滚动到下一个位置,并在按下"删除"按钮时删除上一个项目.
编辑:代码片段.
@Override
public void onPageScrollStateChanged(int state)
{
switch(state)
{
case ViewPager.SCROLL_STATE_DRAGGING:
break;
case ViewPager.SCROLL_STATE_IDLE:
int previousPosition = currentPosition - 1;
if(previousPosition < 0){
previousPosition = 0;
}
MyItem previousItem = itemList.get(previousPosition);
if(previousItem.isDeleted())
{
deleteItem(previousItem);
// deleteItem() Does some DB operations, then calls itemList.remove(position) and notifyDataSetChanged()
}
break;
case ViewPager.SCROLL_STATE_SETTLING:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5427 次 |
| 最近记录: |