2017-01-09 24 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

是'mListA'不斷修改(添加到)數據後,調用'DataResult.getInstance()使用setData(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

有時會出現此錯誤。

這裏是我的建議:

在你DataResult - >getData()

返回數據的副本。

DataResult是一個單例並擁有數據。當您的視圖獲取數據時,視圖將獲取DataResult所持有的數據引用。然後setData()將更改data參考。這裏是IllegalStateException。

希望它會工作:)

0

我覺得你DataResult類是沒有必要的。

根據您的評論,您正在更新數據集時出現錯誤。我認爲你從某些REST API或其他Web服務獲取數據。然後將您從API獲得的數據分配給臨時數組列表,並在獲取新數據時更新該臨時數組列表。在完成接收數據之前,請勿觸摸mListA變量。完成從API獲取數據後,將用於mListA的臨時數組列表直接分配到一行中。

mListA = tmpList; 

然後再次調用

mList = mListA; 
pagerAdapter.notifyDataSetChanged(); 

這應該解決您的錯誤。

0

嘗試使用以下方法:

mList=new ArrayList<Datum>(); 
     mList.addAll(DataResult.getInstance().getData()); 
     DataResult.getInstance().resetData(); 
相關問題