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

标签 android-listview android-fragments android-viewpager

我正在尝试使用 PagerSlidingTabStrip 而不是 TabView 来实现 viewpager。 viewpager 具有三个选项卡,其中每个 ListView 显示事件列表。这三个选项卡分别称为“过去”、“今晚”和“ future ”。

我已将 slider 设置为 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 个 ListView 。 (参见代码部分)

问题是这样的:

我注意到,当我按下后退按钮并再次替换片段时,为了重新打开 View 页面,中间的选项卡不会显示任何 ListView 。如果我向左或向右滑动,则会加载并显示其他选项卡中的内容,但“当前选项卡”仍为空。 当我调试 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];
        }
    }
}

最佳答案

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

adapter = new MyPagerAdapter(getChildFragmentManager());

我想我有点晚了,但如果有人碰巧遇到同样的错误,这里就是解决方案 =)

问。

关于android-listview - 替换片段时无法在 PagerSlidingTabStrip 中加载选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19126208/

相关文章:

android - Android 中每个项目的 ListView 2 行和图标

android - ViewPager 特定版本中的 Settext 问题 - 5.1.1 android?

java - 如何使用 onClick 方法加载到特定的 Fragment/Viewpager 中?

android - 在 ListView 中乘以 TextView

android - ListView 在创建第二个项目后显示项目

android - ListView 向上滚动时加载更多

android - fragment 相互堆叠

java - Android: fragment 生命周期中的方法

java - 在主要 Activity 显示主要内容 View 之前添加 fragment

Android TabLayout PagerAdapter 不显示第一个选项卡 fragment