【问题标题】:ViewPager with AsyncTaskLoader带有 AsyncTaskLoader 的 ViewPager
【发布时间】:2014-04-18 00:34:42
【问题描述】:

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

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" />

主要活动:

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 scrape 和 CardListView 填充调用 AsyncTaskLoader 的每个片段中。现在一切正常,但可以说我在第 1 页。我刷入第3页。然后我滑回page1,内容(ListView)消失了。现在我再次刷到第3页或第4页,也没有内容。所以,长话短说我正在丢失我的数据(尝试过 AsyncTask,但我更喜欢加载器,问题是一样的,所以我认为问题不在加载器中)。然而,这里是其中的一个片段:

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

【问题讨论】:

    标签: java android android-fragments android-viewpager


    【解决方案1】:

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

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

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

    【讨论】:

    • 哇,谢谢,这很容易。是否 setOffscreenPageLimit(),因为不会有太多页面,而且我不喜欢在 onCreateView() 方法中做事;)
    • 是的,只有在页数较少的情况下,第一个解决方案才是好的。如果页数很多,第二种解决方案很好。我认为对于片段,我们应该在 onCreateView() 中编写代码,因为每次重新加载片段时都会调用它。
    • 但我认为不建议在 onCreateView() 中做类似的事情。也许我错了
    • 不,我认为不建议在 onCreateView() 中使用。恭喜您以任何方式获得解决方案。
    • 为了其他人的利益,最好在 onActivityCreated 方法中初始化 - 您通常在活动的 onCreate() 方法或片段的 onActivityCreated() 方法中初始化加载器。 "
    猜你喜欢
    • 2016-10-09
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多