带AsyncTaskLoader的ViewPager [英] ViewPager with AsyncTaskLoader

查看:59
本文介绍了带AsyncTaskLoader的ViewPager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,我很难理解我的应用程序有什么问题.所以我有带有这样的选项卡的ViewPager:

Ok, I'm having hard time of understanding what is wrong with my application. So I have ViewPager with Tabs like this:

Adapter.java

Adapter.java

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:

<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:

MainActivity :

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

在每个片段中,我都使用Jsoup抓取和CardListView填充来调用AsyncTaskLoader.现在一切正常,但可以说我在第1页上.我滑动到页面3.然后,我再次滑回到page1,内容(ListView)消失了.现在,我再次滑动到page3或page4,也没有内容.因此,长话短说,我正在丢失数据(尝试过AsyncTask,但我更喜欢加载器,问题是相同的,所以我认为加载器中没有问题).但是,这是片段之一:

In every one fragment I have called AsyncTaskLoader with Jsoup scrape and CardListView population. Now everything works fine, but lets say I'm on page1. I swipe into the page3. Then I swipe back into page1 and the content (ListView) is gone. Now I'm swiping to page3 or page4 again, there is no content too. So, long story short I'm losing my data ( Tried AsyncTask, but I like loader better and the problem is the same, so I dont think problem is in the Loader ). However here is one of the fragments:

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有关?谢谢;)

Any thoughts whats wrong ? Maybe it's something with PagerAdapter or CardArrayAdapter ? Thanks ;)

推荐答案

有两种方法可以解决此问题.

There are two ways to solve this problem.

  1. 将所有片段一起加载. 为此用途 pager.setOffscreenPageLimit(numberOfFragments); 将适配器设置为viepager后立即生效.

  1. Load all the fragments together. for this use pager.setOffscreenPageLimit(numberOfFragments); immediate after setting the adapter to viepager.

将代码从onCreate()删除到onCreateView() 当您在viewpager中滑动时,片段会重新加载并调用其OncreateView().

Remove the code from onCreate() to onCreateView() As when you swipe through the viewpager, fragment is reloaded and its OncreateView() is called.

这篇关于带AsyncTaskLoader的ViewPager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆