在Android ViewPager中删除项目+滚动到下一步

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)

  • 我尝试了以上,它的工作原理.但是,当我执行notifyDataSetChanged()时,它将已删除的第二页设置为当前页面.能否请你帮忙? (3认同)