После адаптера viewpager notifyDataSetChanged , pagetransformer не работает - PullRequest
0 голосов
/ 04 сентября 2018

Я использую ViewPager и PageAdapter для отображения моих данных, а ViewPager имеет PageTransformer, он работает хорошо, и теперь мне нужно обновить данные и пользовательский интерфейс при переходе к новому элементу, но проблема заключается в том, когда я перемещаю для нового элемента и вызова `adapter.notifyDataSetChanged () мои данные и пользовательский интерфейс обновляются, но мой PageTransformer не работает.

Вот мой код:

mAdapter = new DynamicsCardAdapter(getContext(), mList);
mViewPager.setPageTransformer(true, new ZoomOutPageTransformer2());
mViewPager.setPageMargin(-(int) (width * 0.30));
mViewPager.setAdapter(mAdapter);

адаптер:

public class DynamicsCardAdapter extends PagerAdapter {

    private Context mContext;
    private List<ChildDynamicsInfo> mList;
    private int mPosition = -1;
    private int mChildCount = 0;


    public DynamicsCardAdapter(Context context, List<ChildDynamicsInfo> list) {
        mContext = context;
        mList = list;
    }

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

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

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup viewGroup, int position) {
        View convertView = LayoutInflater.from(mContext).inflate(R.layout.item_parent_dynamics_card, viewGroup, false);
        textName = (TextView) convertView.findViewById(R.id.student_name);
        textName.setText(mList.get(position).name);
        viewGroup.addView(convertView);
        return convertView;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View) object);
    }

    @Override
    public void notifyDataSetChanged() {
        mChildCount = getCount();
        super.notifyDataSetChanged();
    }

    @Override
    public int getItemPosition(@NonNull Object object) {
        //return POSITION_NONE;
        if ( mChildCount > 0) {
            mChildCount --;
            return POSITION_NONE;
        }
        return super.getItemPosition(object);
    }
}

PageTransformer:

public class ZoomOutPageTransformer2 implements ViewPager.PageTransformer {

    private static final float MAX_ROTATE = 30.0f;


    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();
        int pageHeight = view.getHeight();

        float currentRotate = position * MAX_ROTATE;

        if (position < 0) {
            view.setPivotX(pageWidth / 2);
            view.setPivotY(view.getHeight());
            view.setRotation(currentRotate);
        } else if (position <= 1) {
            view.setPivotX(pageWidth / 2);
            view.setPivotY(view.getHeight());
            view.setRotation(currentRotate);
        } else if (position == 0) {
            view.setRotation(0);

        }
    }
}

Обновить данные:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
            mList.get(position).isRead = true;
            mAdapter.notifyDataSetChanged();
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
});

Я просто хочу обновить свой пользовательский интерфейс при перемещении к новому элементу и убедиться, что мой PageTransformer работает хорошо, я пытался:

mViewPager.setAdapter(mAdapter);
mViewPager.setCurrentItem(position);

но поскольку я обновляю пользовательский интерфейс на onPageSelected(), это вызовет StackOverFlow.

...