2017-01-09 8 views
9

大量のデータを渡す必要があるため、静的クラスを使用してインテントを使用せずにビューに値を渡そうとしています。時々私はこのエラーを取得し、Java.lang.IllegalStateException:アプリケーションPagerAdapterは、PagerAdapterを呼び出さずにアダプターの内容を変更しました#notifyDataSetChanged android

エラーの主な理由であるかを調べることができませんでした: -

java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 101, found: 200

マイポケットベルクラス

public class MemeDetailActivity extends AppCompatActivity implements OnDialogClickListner<Void> { 
    private ViewPager mPager; 
    private List<Datum> mList; 
    private ScreenSlidePagerAdapter pagerAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_meme_detail); 
     mList = DataResult.getInstance().getData(); 
     DataResult.getInstance().resetData(); 
     if (mList != null) 
      startPager(selected_position); 
     else 
      Toast.makeText(this, "Error loading data", Toast.LENGTH_SHORT).show(); 
     // ATTENTION: This was auto-generated to implement the App Indexing API. 
     // See https://g.co/AppIndexing/AndroidStudio for more information. 
     client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 
    } 

    private void startPager(int position) { 
     pagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
     mPager.setAdapter(pagerAdapter); 
     pagerAdapter.notifyDataSetChanged(); 
     mPager.setOffscreenPageLimit(0); 
     mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      } 

      @Override 
      public void onPageSelected(int position) { 
       new Interactors(MemeDetailActivity.this).updateView(Util.getAccessToken(), mList.get(position).getId(), new OnFinishListner<ViewsRM>() { 
        @Override 
        public void onFinished(ViewsRM result) { 

        } 

        @Override 
        public void onFailed(String msg) { 
        } 
       }); 
      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 
     mPager.setCurrentItem(position); 
    } 

    public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
     SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 

     public ScreenSlidePagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 


     //todo entry point 3 : showing the image in the viewpager 
     @Override 
     public Fragment getItem(int position) { 
      Fragment fragment = new fragment_mypager_new(); 
      Bundle bundle = new Bundle(); 
      if (frmMyMemes) 
       bundle.putParcelable("MY_DATA", myList); 
      bundle.putSerializable("DATA", mList.get(position)); 
      fragment.setArguments(bundle); 
      return fragment; 
     } 

     @Override 
     public int getItemPosition(Object object) { 
      return POSITION_NONE; 
     } 

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

     @Override 
     public Object instantiateItem(ViewGroup container, int position) { 
      Fragment fragment = (Fragment) super.instantiateItem(container, position); 
      registeredFragments.put(position, fragment); 
      return fragment; 
     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      registeredFragments.remove(position); 
      super.destroyItem(container, position, object); 
     } 

     public Fragment getRegisteredFragment(int position) { 
      return registeredFragments.get(position); 
     } 
    } 

} 

マイ静的クラス

public class DataResult<T> { 

    private static DataResult instance; 
    private List<T> data = null; 

    protected DataResult() { 

    } 

    public static synchronized DataResult getInstance() { 
     if (instance == null) { 
      instance = new DataResult(); 
     } 
     return instance; 
    } 

    public List<T> getData() { 
     return data; 
    } 

    public void setData(List<T> data) { 
     this.data = data; 
    } 

    public void resetData() { 
     data = null; 
    } 
} 

私はこのアクティビティをどのように呼びますか

あなたのコードで
Intent intent = new Intent(getActivity(), MemeDetailActivity.class); 
    DataResult.getInstance().setData(mListA); 
+1

は 'DataResult.getInstance()にsetData(mListA)を呼び出すための後、これまで修正' mListA'(に追加)のデータでありますか; '。? –

+0

David Wasserのコメントポイントが正しい解決策です。そのようなActivity/Fragment間の通信に静的フィールドを使用すべきではありません。インテント、コンテンツプロバイダなどを使用することが想定されています。その後、必要に応じて最適化することができます。静的クラスにこのリストがあり、アダプターに設定された後にこのリストを変更している場合は、取得しているエラーを正確に説明します。それ以外の場合は、この質問の手順に従ってください:https://stackoverflow.com/questions/22943658/illegalstateexception-the-applications-pageradapter-changed-the-adapters-cont –

答えて

0

外観:

@Override 
     public int getItemPosition(Object object) { 
      return POSITION_NONE; 
     } 

このコードは、いつビューの変更ビューをリフレッシュするために使用されます。 notifyDataSetChanged()

オプションのovverrideメソッドとも呼ばれ、削除することができます。

は、この答えを見てみましょう:ViewPager PagerAdapter not updating the View

または他のあなたは時々、このエラーが発生しFragmentStatePagerAdapterFragmentPagerAdapter

+0

私のために働かなかった。それはまだクラッシュします。私が見つけた問題は、APIからデータを取得するたびにリストに追加し、ユーザーがアイテムをクリックするとリストのすべてのデータを渡している場合です。したがって、現在リストに100個のデータがあり、ユーザーが項目をクリックすると同時にリストに99個のデータが追加されて更新されると、合計データ数に競合が発生します。それは私が質問で提供したのと同じコードです。この問題を解決する方法を教えてください。 – viper

+0

アダプタをmListに保存してから、notifydatasetchange()を呼び出してください。私はあなたがmListをアダプタに保管しているところはどこでも見つけることができません。 –

+0

問題はこの行です.. pagerAdapter.notifyDataSetChanged(); –

0

を変更することができます。 - >getData()

リターンデータのコピーをごDataResult

は、ここに私の提案です。

DataResultはシングルトンであり、データを保持します。ビューがデータを取得すると、ビューにはDataResultが保持しているデータ参照ウィジェットが取得されます。その後setData()dataの参照を変更します。ここでIllegalStateExceptionが発生します。

はそれが仕事と願っています:)

0

私はあなたのDataResultクラスが必要ではないと思います。

あなたのコメントによると、データセットを更新している間にエラーが発生しています。私はいくつかのREST APIや別のWebサービスからデータを取得していると思います。次に、新しいデータを取得している間に、APIから取得したデータを一時的な配列リストに割り当て、一時的な配列リストを更新します。データの受信が完了するまで、mListA変数には触れないでください。 APIからデータを完全に取得したら、使用した一時配列リストをmListAに1行で直接割り当てます。

mListA = tmpList; 

その後、再びこれはあなたのエラーを解決する必要があり

mList = mListA; 
pagerAdapter.notifyDataSetChanged(); 

を呼び出します。

0

は、以下の方法を使用してみてください:

mList=new ArrayList<Datum>(); 
     mList.addAll(DataResult.getInstance().getData()); 
     DataResult.getInstance().resetData(); 
関連する問題