ViewPager 懒加载 导致的数据错乱问题

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lvwenbo0107/article/details/52539829

今天遇到了一个问题,ViewPager里面放了3个Fragment A B C。当切换到B时修改里面的值 让他不合法 再切到A再切回B,这时发现验证控件的范围已经异常。

由于用的懒加载,每次切换到一个页面都会重新加载,debug发现 我修改B时是第三条数据,而切换回来后我得到的Bean居然也是第三条数据(已经试过根据pos从list获取,或者根据传进来的bean结果都是不行)我给EditText设置bean后 居然在aferTextChanged里面得到的bean是第一条(正常两个都应该是第一条)。。。

解决方案:1.如果继续使用懒加载 那么 设置convert 中holder.setIsRecyclable(false);  问题解决。

 2.放弃使用懒加载,使用FragmentPagerAdapter ,

设置limit为页面总数-1 我是3个所以 pager.setOffscreenPageLimit(2); 

屏蔽懒加载,这样在fragment初始化时只获取数据一次,以后再怎么切换都不会发生错乱问题了。

上修改代码:

//    @Override
//    public void setUserVisibleHint(boolean isVisibleToUser) {
//        super.setUserVisibleHint(isVisibleToUser);
//        if (isVisibleToUser && isViewCreated && !IsLoadDataCompleted) {
//            setupAlgorithmparaPresenter.bindData();
//            Log.i(TAG, "setUserVisibleHint: ");
//        }
//    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.i(TAG, "onActivityCreated: ");
//        if (getUserVisibleHint())
            setupAlgorithmparaPresenter.bindData();
    }

public class TabAdapter extends FragmentPagerAdapter {
    private List<Fragment> listFragment;
    private List<String> listTitle;

    public TabAdapter(FragmentManager fm, List<Fragment> listFragment, List<String> listTitle) {
        super(fm);
        this.listFragment = listFragment;
        this.listTitle = listTitle;
    }

    @Override
    public Fragment getItem(int position) {
        return listFragment.get(position);
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return listTitle.get(position);
    }

//    @Override
//    public boolean isViewFromObject(View view, Object object) {
//        return view == ((Fragment) object).getView();
//    }
//
//    @Override
//    public void destroyItem(ViewGroup container, int position, Object object) {
//        Fragment fragment = ((Fragment) object);
//    }
}


展开阅读全文

没有更多推荐了,返回首页