android - Android ViewPager删除带动画的项目

标签 android animation android-viewpager

我有一个布局为页面的viewpager。我试图删除单击deletebtn时带有动画的项目。如果页面没有滚动(活动只是用viewpager加载),它几乎可以工作。
如果页面已更改,则动画不会显示,但项目将照常移除。
请帮助我修复删除动画外观。
视图寻呼机适配器代码

@Override
public Object instantiateItem(ViewGroup collection, int position) {
    LayoutInflater inflater = LayoutInflater.from(context);
    ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.item_home_pager, collection, false);
    ImageView deleteBtn = (ImageView) layout.findViewById(R.id.like_btn);
    deleteBtn.setOnClickListener(v -> {
        Animation animation = AnimationUtils.loadAnimation(context, R.anim.slide_to_top);
        layout.startAnimation(animation);           
        removeItem(position);
    });
    collection.addView(layout);
    return layout;
}

public void removeItem(int position) {
    personModels.remove(position);
    notifyDataSetChanged();
}


@Override
public int getItemPosition(Object object) {
    return PagerAdapter.POSITION_NONE;
}


@Override
public void destroyItem(ViewGroup collection, int position, Object view) {
    collection.removeView((View) view);
}

@Override
public int getCount() {
    return personModels.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == object;
}

最佳答案

我做了一些不同的事情,工作顺利。其思想是使用动画移除当前项(将其alpha设置为0),然后水平地将左侧或右侧项(使用动画)平移到现在不可见的项位置。动画完成后,我将执行实际的数据删除和notfyDataSetChanged()调用。
这个remove()方法放在viewpager的一个子类中

public void remove(int position, OnViewRemovedListener onViewRemovedListener) {

    final int childCount = getChildCount();
    if (childCount > 0) {
        View toRemove = getChildAt(position);
        int to = toRemove.getLeft();

        final PagerAdapter adapter = getAdapter();
        toRemove.animate()
                .alpha(0)
                .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime))
                .setListener(new SimpleAnimatorListener() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        if (childCount == 1) {
                            if (onViewRemovedListener != null) onViewRemovedListener.onRemoved(position, -1);
                            if (adapter!= null) adapter.notifyDataSetChanged();
                        }
                    }
                })
                .start();

        if (childCount > 1) {
            int newPosition = position + 1 <= childCount - 1 ? position + 1 : position - 1;
            View replacement = getChildAt(newPosition);
            int from = replacement.getLeft();
            replacement.animate()
                    .setInterpolator(new DecelerateInterpolator())
                    .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime))
                    .translationX(to - from)
                    .setListener(new SimpleAnimatorListener() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            if (onViewRemovedListener != null) onViewRemovedListener.onRemoved(position, newPosition);
                            if (adapter!= null) adapter.notifyDataSetChanged();
                        }
                    })
                    .start();
        }
    }
}

public interface OnViewRemovedListener {

    void onRemoved(int position, int newPosition);
}

关于android - Android ViewPager删除带动画的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44865698/

相关文章:

Android Keystore Type 我应该选择哪一种?

jquery - 延迟时隐藏/偏移WOW js动画

android - 如何定义PagerTitleStrip 两侧TextView 的宽度?

android - 使用寻呼机 View 滑动页面的一部分

android - 如何使用 ViewPager 在 Activity 中显示存储在 SD 卡上的图像?

android - AuthException 未解析为类型和多个 dex 文件 - 构建路径

java - 强制关闭膨胀 XML

java - 编程端 ActionBar 中可绘制的后退箭头的 ID

html - 带有 Google map 标记的效果和动画

html - CSS 动画 - 无限动画重新启动时有延迟