1. 程式人生 > >ViewPager 懶載入 導致的資料錯亂問題

ViewPager 懶載入 導致的資料錯亂問題

今天遇到了一個問題,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);
//    }
}