2015-05-06 21 views
0

我在mainActivity的Android跑出的内存getCount将 “notifyDataSetChanged()”()

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 
    setContentView(R.layout.activity_main); 

    mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager()); 
    mAppSectionsPagerAdapter.setContext(this); 

    try { 
     final ActionBar actionBar = getActionBar(); 

     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mAppSectionsPagerAdapter); 
     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

     for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) { 
      actionBar.addTab(
        actionBar.newTab() 
          .setText(mAppSectionsPagerAdapter.getPageTitle(i)) 
          .setTabListener(this)); 
     } 
    } 
    catch (Exception e) 
    { 
     Log.d("myLOG", e.toString()); 
    } 

除了创建pageAdapter后,我有SingleItemActivity当我在ListViewItem的点击将打开:

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
          Intent intent = new Intent(getActivity(), SingleItemActivity.class); 
          intent.putExtra("id", id); 
          intent.putExtra("listViewID", 1); 
          startActivity(intent); 

我在2个选项卡中有2个列表,当我点击第一个列表中的某个项目时 - 通常会打开,但是当我打开第二个选项卡并点按某个项目时,Android会与我通话:

The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 2, found: 1 

好吧,我改getCount将方法:

@Override 
     public int getCount() { 
      notifyDataSetChanged(); 
      return Cache.jsonData[listViewID].length(); 
     } 

所以,当我试图从任何列表Android开放项目显示我:

Throwing OutOfMemoryError "Failed to allocate a 28 byte allocation with 4 free bytes and 4B until OOM" 

有人能帮忙吗?感谢您阅读我的英语不好))

回答

-1

如果您的适配器是不是FragmentStatePagerAdapter,你应该使用它,对于getCount将使用:

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

但getItemPosition使用:

@Override 
    public int getItemPosition(Object object) { 
     YourFragment fragment = (YourFragment)object; 
     int position = items.indexOf(fragment.getItem()); 

     if(position >= 0) { 
      fragment.pudDataChanges(); 
      return position; 
     } else return POSITION_NONE; 
    } 

然后使用:

@Override 
    public Fragment getItem(int position) { 
     YourFragment fragment = new YourFragment(); 
     fragment.setItem(items.get(position)); 
     return fragment; 
    } 

而在你的片段中: setItem(Item item)用于sotre任何变化,putDataChanges()是GET从Item变化,并用它

,将工作肯定

0

正如错误解释,你改变的ArrayList的内容后,您需要告诉列表数据来源已经改变,并且需要重新绘制以显示新数据。

所以,这就是notifyDatasetChanged()进来它告诉该数据已经被修改的ListView。并显示新的数据,必须重绘ListView。

我不知道你所说的“标签”的意思,但机会是你是不是在正确的地方使用notifyDataSetChanged()。如果您使用的操作栏选项卡的内容是从完全不同的活动或片段返回的(并且听起来像您),您必须在必须返回该活动的代码中使用操作栏适配器的notifyDataSetChanged()数据。例如,

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) 
    { 
     case R.id.action_new_forward: 

      FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab 
      Intent ina = new Intent(getApplicationContext(), MainActivity.class); 
      ina.putExtra("stra", values1); 
      startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment). 
    } 
} 

这项活动将返回一些数据FragmentTab2,它会直接在FragmentTab2更新列表视图。

0

因为notifyDataSetChanged();getCount()和你的情况,请致电notifyDataSetChanged();

所以只是分裂2调用