android actionbar tab viewpage AsyncTask第一个选项卡在启动时为空

时间:2014-11-23 17:39:14

标签: android android-fragments android-asynctask

有几天我试图解决这个问题。请帮帮我。

我使用带有viewpager的标签导航。有四个片段。我使用异步任务来下载我需要放在视图中的数据。当应用程序启动时,第一个片段是ampty。但是当我刷到第二个或第三个时,他们有数据。如果我从第二个刷到第一个,它也有数据。所以我想我可能是 notifyDataSetChanged 有问题,但我尝试了它并没有用。

MainActivity.java

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());

    final ActionBar actionBar = getActionBar();

    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayShowTitleEnabled(false);

    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setOffscreenPageLimit(1);
    mViewPager.setAdapter(mAppSectionsPagerAdapter);

    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        //private ArrayList hasLoadedPages = new ArrayList<Integer>();
        @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));
    }
  }

public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    mViewPager.setCurrentItem(tab.getPosition());
}

public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {


    public AppSectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }


    @Override
    public Fragment getItem(int i) {
        switch (i) {
            //case 0:
            //    return new LaunchpadSectionFragment();

            default:
                Fragment fragment = new DummySectionFragment();
                Bundle args = new Bundle();
                args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, i + 1);
                fragment.setArguments(args);
                return fragment;
        }
    }

    @Override
    public int getCount() {
        return 4;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        String str="";
        if (position==0){
            str = "one";
        }else if(position==1){
            str = "two";
        }else if(position==2){
            str = "three";
        }else if(position==3){
            str = "four";
        }
        return str;
    }

    @Override
    public void notifyDataSetChanged()
    {
        super.notifyDataSetChanged();
    }

}

public static class DummySectionFragment extends Fragment {

    public static final String ARG_SECTION_NUMBER = "section_number";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_section_dummy, container, false);
        return rootView;

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        Bundle args = getArguments();
        mCid = args.getInt(ARG_SECTION_NUMBER);
        mNewsData = new ArrayList<HashMap<String,Object>>();
        mNewsList = (ListView)getView().findViewById(android.R.id.list);
        mNewsListAdapter = new SimpleAdapter(this.getActivity(), mNewsData, R.layout.newslist_item, 
                new String[]{"newslist_item_title","newslist_item_digest","newslist_item_source","newslist_item_ptime"}, 
                new int[]{R.id.newslist_item_title,R.id.newslist_item_digest,R.id.newslist_item_source,R.id.newslist_item_ptime});
        View loadMoreLayout = this.getLayoutInflater(savedInstanceState).inflate(R.layout.loadmore, null);
        mNewsList.setAdapter(mNewsListAdapter);
        mNewsList.addFooterView(loadMoreLayout);
        mNewsList.setOnItemClickListener(new OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                Intent intent = new Intent(getActivity(), NewsDetailsActivity.class);
                startActivity(intent);
                intent.putExtra("newsDate", mNewsData);
                intent.putExtra("position", position);
                startActivity(intent);
            }
        });
        mLoadMoreBtn = (Button)getView().findViewById(R.id.loadmore_btn);
        mLoadMoreBtn.setOnClickListener(loadMoreListener);

        loadNewsAsyncTask = new LoadNewsAsyncTask();
        loadNewsAsyncTask.execute(mCid,0,true);
    }
}

private static class LoadNewsAsyncTask extends AsyncTask<Object, Integer, Integer>
{

    @Override
    protected void onPreExecute()
    {
        mLoadMoreBtn.setText(R.string.loadmore_txt);
    }

    @Override
    protected Integer doInBackground(Object... params)
    {
        return getSpeCateNews((Integer)params[0],mNewsData,(Integer)params[1],(Boolean)params[2]);
    }

    @Override
    protected void onPostExecute(Integer result)
    {
        switch (result)
        {
        case NONEWS:
            mLoadMoreBtn.setText(R.string.no_news);
            break;
        case NOMORENEWS:
            mLoadMoreBtn.setText(R.string.no_more_news);
            break;
        case LOADERROR:
            mLoadMoreBtn.setText(R.string.load_news_failure);
            break;
        }
        mNewsListAdapter.notifyDataSetChanged();
        mLoadMoreBtn.setText(R.string.loadmore_btn);
    }
}

1 个答案:

答案 0 :(得分:0)

您正在使用FragmentPagerAdapter,请将其更改为FragmentStatePagerAdapter并再次运行

FragmentPagerAdapter和FragmentStatePagerAdapter之间的区别

关于FragmentPagerAdapter Google的指南说:

当有一些通常更多的静态片段被分页时,这个版本的寻呼机最适合使用,例如一组标签。用户访问的每个页面的片段将保留在内存中,但其视图层次结构可能在不可见时被销毁。这可能导致使用大量内存,因为片段实例可以保持任意数量的状态。对于较大的页面集,请考虑FragmentStatePagerAdapter。

关于FragmentStatePagerAdapter:

当存在大量页面时,此版本的寻呼机更有用,更像列表视图。当页面对用户不可见时,它们的整个片段可能会被破坏,只保留该片段的保存状态。与FragmentPagerAdapter相比,这允许寻呼机保持与每个被访问页面相关联的更少内存,代价是在页面之间切换时可能产生更多开销。