替换片段时无法在PagerSlidingTabStrip中加载选项卡

时间:2013-10-01 21:23:54

标签: android-listview android-fragments android-viewpager

我正在尝试使用PagerSlidingTabStrip而不是TabView来实现viewpager。 viewpager有三个选项卡,每个listview显示一个事件列表。这三个标签分别称为过去,今晚和未来。

我已设置滑块,因为github页面建议:

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        View v = inflater.inflate(R.layout.all_events_main_strip, container, false);     

        // Set up the ViewPager, attaching the adapter and setting up a listener for when the
        // user swipes between sections.
        pager = (ViewPager) v .findViewById(R.id.pager_main);
        tabs = (PagerSlidingTabStrip) v.findViewById(R.id.tabs);
        adapter = new MyPagerAdapter(getFragmentManager());

        pager.setAdapter(adapter);
        tabs.setViewPager(pager);

        // Set Present tab as default
        pager.setCurrentItem(1);
        return v;
    }

当应用程序启动时,主要活动首次添加此片段,一切正常。 3个可滑动的标签,包含3个列表视图。 (参见代码部分)

以下是问题

我注意到当我按下后退按钮并再次替换片段时,为了重新打开viewpager,中间的选项卡不会显示任何列表视图。如果我向左或向右键,则会加载并显示其他选项卡中的内容,但“当前”选项卡仍为空。 当我调试ToNightEvents时,根本没有调用ListFragment。 你们有什么建议来解决这个问题吗?

代码:

代码的结构如下:在onCreateView之后我添加了一个OnDestroyView方法来删除片段,但它不起作用......然后在fragmentPagerAdapter中,每个页面都被调用为getItem方法中的片段。最后在代码的末尾,您可以看到三个ListFragment类,其中通过AsyncTask填充listview

public class FragmentAllEvents extends Fragment 
{
    private static final String TAG_UID = "uid";
    private static final String TAG_LOGO = "logo";
    private static final String TAG_POKUID = "pokuid";

    static ArrayList<HashMap<String, String>> userList;
    ArrayList<HashMap<String, String>> userListTotal;
    private final Handler handler = new Handler();
    HashMap<String, String> userSelected;
    EventsFunctions eventsFunctions;
    UserFunctions userFunctions;
    static ListView lv;
    ActionBar actionBar;
    MyPagerAdapter adapter;
    ViewPager pager;
    PagerSlidingTabStrip tabs;
    private Drawable oldBackground = null;
    private int currentColor = 0xFF666666;
    //Context context = this;

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

        // Set up the action bar.
        actionBar = getActivity().getActionBar();
        actionBar.setHomeButtonEnabled(true);

    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        View v = inflater.inflate(R.layout.all_events_main_strip, container, false);
        pager = (ViewPager) v .findViewById(R.id.pager_main);
        tabs = (PagerSlidingTabStrip) v.findViewById(R.id.tabs);
        adapter = new MyPagerAdapter(getFragmentManager());

        pager.setAdapter(adapter);

        tabs.setViewPager(pager);

        pager.setCurrentItem(1);
        return v;
    }

    @Override
    public void onDestroyView() 
    {
         super.onDestroyView();
         getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
    }

    public static class MyPagerAdapter extends FragmentPagerAdapter 
    {

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


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

                case 1:
                    return new ToNightEvents();

                case 2:
                    return new FutureEvents();

                /*default:
                    // The other sections of the app are dummy placeholders.

                    return new ToNightEvents();
                  */  
            }
            return null;
        }


        /**
         * A fragment that launches past events list.
         */
        public static class PastEvents extends ListFragment implements
        PullToRefreshAttacher.OnRefreshListener 
        {
            private ListView pastList;
            private PullToRefreshAttacher mPullToRefreshAttacher;
            ProgressBar progress;
            String tabTime;

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
            {
                View pastView = inflater.inflate(R.layout.pastlist, container, false);
                progress = (ProgressBar) pastView.findViewById(R.id.loading_spinner_past);
                tabTime="past";
                pastList = (ListView) pastView.findViewById(android.R.id.list);

                // Now get the PullToRefresh attacher from the Activity. An exercise to the reader
                // is to create an implicit interface instead of casting to the concrete Activity
                mPullToRefreshAttacher =  ((Home) getActivity()).getPullToRefreshAttacher();

                // Now set the ScrollView as the refreshable view, and the refresh listener (this)
                mPullToRefreshAttacher.addRefreshableView(pastList, this);

                new AsyncLoadEvents(getActivity(), progress, pastList, mPullToRefreshAttacher).execute(tabTime);
                return pastView;
            }


            @SuppressWarnings("unchecked")
            @Override
            public void onListItemClick(ListView listView, View view, int position, long id) 
            {
                super.onListItemClick (listView, view, position, id);
                HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position);
                //Log.e("AttendList Report", "Clicked list item: " + position +" Content: \n" + map.get(TAG_ID).toString());
                Log.e("PastList Report", "Clicked list item: " + position +" Event's content: \n" + map.get(TAG_UID).toString());
                Intent intent = new Intent(getActivity(), SingleEventActivity.class);

                intent.putExtra("pokuid",map.get(TAG_POKUID)); // Maybe remove attribute toString();
                intent.putExtra("uid", map.get(TAG_UID)); 
                intent.putExtra("logo",map.get(TAG_LOGO));
                getActivity().startActivity(intent);
            }

            @Override
            public void onRefreshStarted(View view) 
            {
                new AsyncLoadEvents(getActivity(), progress, pastList, mPullToRefreshAttacher).execute(tabTime);                
            }

        }

        /**
         * A fragment that launches future event list.
         */
        public static class FutureEvents extends ListFragment  implements
        PullToRefreshAttacher.OnRefreshListener 
        {
            private ListView futureList;
            private PullToRefreshAttacher mPullToRefreshAttacher;
            ProgressBar progress;
            String tabTime;

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
            {
                View futureView = inflater.inflate(R.layout.futurelist, container, false);
                progress = (ProgressBar) futureView.findViewById(R.id.loading_spinner_future);
                tabTime  = "future";
                futureList = (ListView) futureView.findViewById(android.R.id.list); //change to attendlist if needed


                // Now get the PullToRefresh attacher from the Activity. An exercise to the reader
                // is to create an implicit interface instead of casting to the concrete Activity
                mPullToRefreshAttacher =  ((Home) getActivity()).getPullToRefreshAttacher();

                // Now set the ScrollView as the refreshable view, and the refresh listener (this)
                mPullToRefreshAttacher.addRefreshableView(futureList, this);

                new AsyncLoadEvents(getActivity(), progress, futureList, mPullToRefreshAttacher).execute(tabTime);
                return futureView;
            }

            @SuppressWarnings("unchecked")
            @Override
            public void onListItemClick(ListView listView, View view, int position, long id) 
            {
                super.onListItemClick (listView, view, position, id);

                HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position);
                Log.e("PastList Report", "Clicked list item: " + position +" Event's content: \n" + map.get(TAG_UID).toString());
                Intent intent = new Intent(getActivity(), SingleEventActivity.class);


                intent.putExtra("pokuid",map.get(TAG_POKUID)); // Maybe remove attribute toString();
                intent.putExtra("uid", map.get(TAG_UID)); 
                intent.putExtra("logo",map.get(TAG_LOGO));
                getActivity().startActivity(intent);

            }

            @Override
            public void onRefreshStarted(View view) 
            {
                new AsyncLoadEvents(getActivity(), progress, futureList, mPullToRefreshAttacher).execute(tabTime);              
            }
        }

        /**
         * A fragment that launches future event list.
         */
        public static class ToNightEvents extends ListFragment implements
        PullToRefreshAttacher.OnRefreshListener 
        {
            private ListView tonightList;
            private PullToRefreshAttacher mPullToRefreshAttacher;
            ProgressBar progress;
            String tabTime;

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
            {
                View tonightView = inflater.inflate(R.layout.tonightlist, container, false);
                progress = (ProgressBar) tonightView.findViewById(R.id.loading_spinner_tonight);
                tabTime  = "tonight";
                tonightList = (ListView) tonightView.findViewById(android.R.id.list); //change to attendlist if needed

                // Now get the PullToRefresh attacher from the Activity. An exercise to the reader
                // is to create an implicit interface instead of casting to the concrete Activity
                mPullToRefreshAttacher =  ((Home) getActivity()).getPullToRefreshAttacher();

                // Now set the ScrollView as the refreshable view, and the refresh listener (this)
                mPullToRefreshAttacher.addRefreshableView(tonightList, this);

                new AsyncLoadEvents(getActivity(), progress, tonightList, mPullToRefreshAttacher).execute(tabTime);
                return tonightView;
            }


            @SuppressWarnings("unchecked")
            @Override
            public void onListItemClick(ListView listView, View view, int position, long id) 
            {
                super.onListItemClick (listView, view, position, id);

                HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position);
                Log.e("PastList Report", "Clicked list item: " + position +" Event's content: \n" + map.get(TAG_UID).toString());
                Intent intent = new Intent(getActivity(), SingleEventActivity.class);


                intent.putExtra("pokuid",map.get(TAG_POKUID)); // Maybe remove attribute toString();
                intent.putExtra("uid", map.get(TAG_UID)); 
                intent.putExtra("logo",map.get(TAG_LOGO));
                getActivity().startActivity(intent);

            }

            @Override
            public void onRefreshStarted(View view) 
            {
                new AsyncLoadEvents(getActivity(), progress, tonightList, mPullToRefreshAttacher).execute(tabTime);             
            }
        }

        public String[] titles=
        {
            "Past",
            "Tonight",
            "Future"
        };

        @Override
        public int getCount() 
        {
            return titles.length;
        }

        @Override
        public CharSequence getPageTitle(int position) 
        {
            return titles[position];
        }
    }
}

2 个答案:

答案 0 :(得分:5)

如果您在Activity中,这通常会起作用,但是我猜你是在Fragment中,因为你发布的代码是onCreateView()方法。问题是你正在尝试使用Activity的FragmentManager,你应该使用Fragment的FragmentManager。这个FragmentManager不是你需要的。试试这个:

adapter = new MyPagerAdapter(getChildFragmentManager());

我觉得我有点迟了但如果有人碰巧遇到同样的错误,那么解决方案就是=)

Q值。

答案 1 :(得分:0)

以下为我解决了这个问题:

  • 将OnBackStackChangedListener添加到片段管理器。
  • 在onBackStackChanged方法中,获取对ViewPager和PagerSlidingTabStrip(示例中的分页器和选项卡)的引用。如果相应的片段当前处于活动状态,请执行以下操作:

    pager.invalidate();
    tabs.invalidate();
    pager.setAdapter(new MyPagerAdapter(getFragmentManager()));
    tabs.setViewPager(pager);