首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewPager与AsyncTaskLoader

ViewPager与AsyncTaskLoader
EN

Stack Overflow用户
提问于 2014-04-17 16:27:53
回答 1查看 833关注 0票数 0

好吧,我很难理解我的应用程序出了什么问题。所以我有ViewPager和这样的Tabs:

Adapter.java

代码语言:javascript
复制
public class CustomPagerAdapter extends FragmentPagerAdapter {

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

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new Fragment1();
        case 1:
            return new Fragment2();

        // And so on...

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

以下是xml:

代码语言:javascript
复制
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.env.test.app.MainActivity" />

MainActivity:

代码语言:javascript
复制
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

static final String[] tabTitles = {"test1","test2","test3","tes3"};
CustomPagerAdapter adapter;
ViewPager viewPager;
ActionBar actionBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    adapter = new CustomPagerAdapter(getSupportFragmentManager());
    actionBar = getActionBar();
    viewPager = (ViewPager) findViewById(R.id.pager);

    viewPager.setAdapter(adapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    for (String tabTitle : tabTitles) {
        actionBar.addTab(actionBar.newTab().setText(tabTitle).setTabListener(this));

    }

    viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            super.onPageScrolled(position, positionOffset, positionOffsetPixels);
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            super.onPageScrollStateChanged(state);
        }
    });
} // And 3 more implemented methods of tabs...

在每一个片段中,我都调用了AsyncTaskLoader,其中包含了Jsoup、scrape和CardListView种群。现在一切都很好,但是让我说我在page1上。我冲进了page3。然后我又回到page1,内容(ListView)就消失了。现在我又一次浏览page3或page4,也没有任何内容。所以,长话短说,我丢失了我的数据(尝试过AsyncTask,但我更喜欢加载程序,问题也是一样的,所以我认为问题不存在于加载程序中)。然而,以下是其中的一个片段:

代码语言:javascript
复制
public class Fragment1 extends Fragment implements LoaderManager.LoaderCallbacks<ArrayList<Card>> {

SharedPreferences accountData;
String accountID, accountPassword;

public Fragment1() {

}

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

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    accountData = getActivity().getSharedPreferences(otheractivity.filename, 0);
    accountID = accountData.getString("accountID", null);
    accountPassword = accountData.getString("accountPassword", null);

    getActivity().getSupportLoaderManager().initLoader(0, null, this);
}

@Override
public Loader<ArrayList<Card>> onCreateLoader(int id, Bundle args) {
    return new NetworkTask(getActivity(), accountID, accountPassword, getString(R.string.login_url), getString(R.string.target_url));
}

@Override
public void onLoadFinished(Loader<ArrayList<Card>> loader, ArrayList<Card> result) {
    if (result != null) {
        CardArrayAdapter adapter = new CardArrayAdapter(getActivity(), result);
        CardListView cardListView = (CardListView) getActivity().findViewById(R.id.listView_schedule);
        if (cardListView != null) {
            cardListView.setAdapter(adapter);
        }
    } else {
        TextView warning = (TextView) getActivity().findViewById(R.id.textView_sheduleWarning);
        warning.setText("blah blah blah");
    }
}

@Override
public void onLoaderReset(Loader<ArrayList<Card>> loader) {
}

}

有什么想法吗?也许是和PagerAdapter或CardArrayAdapter有关?(谢谢;)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-17 16:34:42

解决这个问题有两种方法。

  1. 把所有的碎片装在一起。为此,在将适配器设置为viepager后立即使用pager.setOffscreenPageLimit(numberOfFragments);。
  2. 将代码从onCreate()移到onCreateView(),就像在浏览viewpager时一样,重新加载片段并调用其OncreateView()。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23138613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档