Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android在“之后内存不足”;notifyDataSetChanged();在getCount()中_Java_Android - Fatal编程技术网

Java Android在“之后内存不足”;notifyDataSetChanged();在getCount()中

Java 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

我已在mainActivity中创建了pageAdapter

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).
    } 
}