簡體   English   中英

Android ViewPager刪除帶動畫的項目

[英]Android ViewPager remove item with animation

我有viewpager布局作為page.I嘗試刪除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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM