Android-ViewPager+;碎片状态页面雷达&x2B;页面转换器
在我的应用程序中,我使用ViewPager和PageTransformer将一些数据列表显示为卡片组。该列表有时会被刷新,并且在常见情况下包含大量项,因此我使用FragmentStatePagerAdapter并设置所需的页面限制:Android-ViewPager+;碎片状态页面雷达&x2B;页面转换器,android,android-viewpager,fragmentstatepageradapter,android-pagetransformer,Android,Android Viewpager,Fragmentstatepageradapter,Android Pagetransformer,在我的应用程序中,我使用ViewPager和PageTransformer将一些数据列表显示为卡片组。该列表有时会被刷新,并且在常见情况下包含大量项,因此我使用FragmentStatePagerAdapter并设置所需的页面限制: public class PlaceListPagerAdapter extends FragmentStatePagerAdapter { private List<PlaceListData> items; public Plac
public class PlaceListPagerAdapter extends FragmentStatePagerAdapter {
private List<PlaceListData> items;
public PlaceListPagerAdapter (FragmentManager manager) {
super (manager);
items = new ArrayList<>();
}
@Override
public Fragment getItem(int position) {
String id = items.get(position).getId();
String name = items.get(position).getName();
String address = items.get(position).getAddress();
return PlaceFragment.newInstance(id, name, address);
}
@Override
public int getCount() {
return items.size();
}
@Override
public int getItemPosition(Object object) {
PlaceFragment frag = (PlaceFragment) object;
String id = frag.getDataId();
for (PlaceListData data : items) {
if (id != null && id.equals(data.getId())) {
return POSITION_UNCHANGED;
}
}
return POSITION_NONE;
}
public void addItems(List<PlaceListData> items) {
this.items.addAll(items);
notifyDataSetChanged();
}
public void replaceItems(List<PlaceListData> items) {
this.items.clear();
addItems(items);
}
public void clearItems () {
this.items.clear();
notifyDataSetChanged();
}
}
公共类PlaceListPagerAdapter扩展了FragmentStatePagerAdapter{
私人清单项目;
public PlaceListPagerAdapter(碎片管理器){
高级经理;
items=newarraylist();
}
@凌驾
公共片段getItem(int位置){
String id=items.get(position.getId();
字符串名称=items.get(position.getName();
字符串地址=items.get(position.getAddress();
返回PlaceFragment.newInstance(id、名称、地址);
}
@凌驾
public int getCount(){
返回items.size();
}
@凌驾
public int getItemPosition(对象){
PlaceFragment frag=(PlaceFragment)对象;
字符串id=frag.getDataId();
对于(PlaceListData:项目){
如果(id!=null&&id.equals(data.getId())){
返回位置_不变;
}
}
返回位置\无;
}
公共无效附加项(列表项){
this.items.addAll(items);
notifyDataSetChanged();
}
公共项目(列表项目){
this.items.clear();
补充项目(项目);
}
公共项目(){
this.items.clear();
notifyDataSetChanged();
}
}
没有异常-POJO列表,覆盖了getItemPosition()和使用notifyDataSetChanged()添加/清除方法。问题是,当我尝试通过网络添加/替换项时,我的transformer的方法transformPage(视图视图,浮动位置)被调用,所有新视图的位置为0.0,并且它们被一个放置在另一个上(转换被破坏)
调试ViewPager类后,我注意到,transformPage(查看视图,浮动位置)仅在ViewPager的onPageScrolled(..)方法中的一个位置调用,后者在第一次布局过程后在onLayout(..)中调用
notifyDataSetChanged()在调用onPageScrolled(..)(和transformPage(视图、浮动位置))和requestLayout()之后。问题在于,第一次调用transformPage(查看视图,浮动位置)发生在布局过程之前,并且位置参数取决于视图。left()返回0,因为未布局子视图。在onLayout(…)中,在requestLayout()mytransformPage(查看视图,浮动位置)后面的onLayout(…)中,根本不调用,因为是的,视图现在已布局,但它不是第一个布局过程
通过重置适配器(将ViewPager中的mFirstLayout标记设置为“true”)或调用调用其代码中调用transformPage(查看视图、浮动位置)的ViewPager的任何公共方法来解决此问题,例如滚动到、fakeDrag等,但我想知道——这是ViewPager的一个功能,还是一个bug,或者我做了一些非常错误的事情
对不起,我的英语不好,提前谢谢你