Я использую 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
.