Java Android在“之后内存不足”;notifyDataSetChanged();在getCount()中
我已在mainActivity中创建了pageAdapterJava Android在“之后内存不足”;notifyDataSetChanged();在getCount()中,java,android,Java,Android,我已在mainActivity中创建了pageAdapter public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_ACTION_BAR); setContentView(R.layout.activity_main); mAppSectionsPagerAdap
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());
}
好的,我将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"
有人能帮忙吗?感谢您阅读我的蹩脚英语)如果您的适配器不是
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()
用于从Item
获取更改并使用它
正如错误所解释的那样,更改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中的listview。因为
notifyDataSetChanged()
调用getCount()
,在您的情况下,调用notifyDataSetChanged()代码>,等等
那就把两个电话分开吧
@Override
public Fragment getItem(int position) {
YourFragment fragment = new YourFragment();
fragment.setItem(items.get(position));
return fragment;
}
@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).
}
}