2017-01-09 51 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();