【问题标题】:PagerAdapter#notifyDataSetChangePagerAdapter#notifyDataSetChange
【发布时间】:2017-09-13 04:39:19
【问题描述】:

我的自定义 PageAdapter 类中出现以下错误,该类继承自 FragmentStatePagerAdapter,我有 10 个标签可以找到我的产品,PageAdaptar 有 2 个方法覆盖了 public CharSequence getPageTitle、public int getCount () 和一个构造函数。这标志着我的以下错误:-> 应用程序的 PagerAdapter 在没有调用 PagerAdapter # notifyDataSetChanged 的​​情况下更改了适配器的内容!适配器元素的估计数量:0,找到:10 Pager

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.TabLayout
        android:id="@+id/tablayout_menu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/blanco"
        android:scrollbars="horizontal"
        app:tabGravity="fill"
        app:tabSelectedTextColor="@color/colorPrimaryDark"
        app:tabTextColor="@color/negro"
        app:tabMode="scrollable" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager_menu"
        android:paddingBottom="50dp"
        android:fitsSystemWindows="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/tablayout_perfil"/>

</LinearLayout>

立即有我的自定义适配器,根据位置我返回一个片段

 public class CostumAdapter2 extends FragmentStatePagerAdapter {

        public CostumAdapter2(FragmentManager fm) {
            super(fm);

        }

        @Override
        public Fragment getItem(int position) {
            Bundle bundle = new Bundle();

            switch (position) {
                case 0:

                    FragmentBebidas fragmentBebidas = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas.setArguments(bundle);
                    return fragmentBebidas;

                case 1:
                    FragmentBebidas fragmentBebidas2 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas2.setArguments(bundle);
                    return fragmentBebidas2;

                case 2:
                    FragmentBebidas fragmentBebidas3 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas3.setArguments(bundle);
                    return fragmentBebidas3;


                case 3:
                    FragmentBebidas fragmentBebidas4 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas4.setArguments(bundle);
                    return fragmentBebidas4;


                case 4:
                    FragmentBebidas fragmentBebidas5 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas5.setArguments(bundle);
                    return fragmentBebidas5;


                case 5:
                    FragmentBebidas fragmentBebidas6 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas6.setArguments(bundle);
                    return fragmentBebidas6;


                case 6:
                    FragmentBebidas fragmentBebidas7 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas7.setArguments(bundle);
                    return fragmentBebidas7;


                case 7:
                    FragmentBebidas fragmentBebidas8 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas8.setArguments(bundle);
                    return fragmentBebidas8;


                case 8:
                    FragmentBebidas fragmentBebidas9 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas9.setArguments(bundle);
                    return fragmentBebidas9;
                case 9:
                    FragmentBebidas fragmentBebidas10 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas10.setArguments(bundle);
                    return fragmentBebidas10;
            }
            return null;

        }
        @Override
        public CharSequence getPageTitle(int position) {
            return menuTabs.get(position).toString();
        }
        @Override
        public int getCount() {
            return menuTabs.size();
        }


    }

这里是执行下一个操作以膨胀包含选项卡的片段的位置

ahBottomNavigation.setOnTabSelectedListener(new AHBottomNavigation.OnTabSelectedListener() {
            @Override
            public boolean onTabSelected(int position, boolean wasSelected) {
                // Do something cool here...
                switch (position) {

                    case 0:

                        //seteando el texto del menu
                        tituloActivity.setText("Menú");
                        iconBack.setVisibility(View.INVISIBLE);
                        //Toast.makeText(getApplicationContext(), "Menú", Toast.LENGTH_LONG).show();
                        FragmentManager fragmentManager = getSupportFragmentManager();
                        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                        MenuViewController menuViewController = new MenuViewController();
                        /**menuViewController.setArguments(bundle);**/
                        fragmentTransaction.add(R.id.myFragemnt,menuViewController);
                        fragmentTransaction.replace(R.id.myFragemnt, menuViewController);
                        fragmentTransaction.commit();


                        return true;
                    case 1:

这部分是我设置 setOnTabSelectedListener 事件的地方

  rootView = inflater.inflate(R.layout.menu_layout, container, false);
        tabLayout = (TabLayout) rootView.findViewById(R.id.tablayout_menu);
        viewPager = (ViewPager) rootView.findViewById(R.id.viewPager_menu);
        CostumAdapter2  costumAdapter =  new CostumAdapter2(getActivity().getSupportFragmentManager());
        viewPager.setAdapter(costumAdapter);
        costumAdapter.notifyDataSetChanged();
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
            }
        });

        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

        });

        return rootView;
    }
> 04-17 09:25:56.041: E/AndroidRuntime(30450): FATAL EXCEPTION: main
> 04-17 09:25:56.041: E/AndroidRuntime(30450): Process:
> com.blueicon.romerito, PID: 30450 04-17 09:25:56.041:
> E/AndroidRuntime(30450): java.lang.IllegalStateException: The
> application's PagerAdapter changed the adapter's contents without
> calling PagerAdapter#notifyDataSetChanged! Expected adapter item
> count: 0, found: 10 Pager id: com.blueicon.romerito:id/viewPager_menu
> Pager class: class android.support.v4.view.ViewPager Problematic
> adapter: class
> com.blueicon.romerito.controller.menuprincipal.fragmentosmenu.MenuViewController$CostumAdapter2
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.v4.view.ViewPager.populate(ViewPager.java:1167) 04-17
> 09:25:56.041: E/AndroidRuntime(30450):  at
> android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:668)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:630)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:611)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2178)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.design.widget.TabLayout.dispatchTabSelected(TabLayout.java:1155)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.design.widget.TabLayout.selectTab(TabLayout.java:1148)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.design.widget.TabLayout.selectTab(TabLayout.java:1118)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.design.widget.TabLayout.populateFromPagerAdapter(TabLayout.java:916)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.design.widget.TabLayout.setPagerAdapter(TabLayout.java:900)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.design.widget.TabLayout.setupWithViewPager(TabLayout.java:813)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.design.widget.TabLayout.setupWithViewPager(TabLayout.java:774)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.support.design.widget.TabLayout.setupWithViewPager(TabLayout.java:752)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> com.blueicon.romerito.controller.menuprincipal.fragmentosmenu.MenuViewController$1.run(MenuViewController.java:70)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> android.os.Handler.handleCallback(Handler.java:739) 04-17
> 09:25:56.041: E/AndroidRuntime(30450):  at
> android.os.Handler.dispatchMessage(Handler.java:95) 04-17
> 09:25:56.041: E/AndroidRuntime(30450):  at
> android.os.Looper.loop(Looper.java:158) 04-17 09:25:56.041:
> E/AndroidRuntime(30450):    at
> android.app.ActivityThread.main(ActivityThread.java:7229) 04-17
> 09:25:56.041: E/AndroidRuntime(30450):  at
> java.lang.reflect.Method.invoke(Native Method) 04-17 09:25:56.041:
> E/AndroidRuntime(30450):    at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
> 04-17 09:25:56.041: E/AndroidRuntime(30450):    at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

【问题讨论】:

  • 我忘了说它们是 2 个嵌套片段
  • 发布您的适配器和活动代码..
  • acabo de agregar el PagerAdapter @FerdousAhamed
  • 你在哪里声明了 menuTabs?
  • 添加xml和我使用适配器@FerdousAhamed的部分

标签: android


【解决方案1】:

更新您的CostumAdapter2 如下:

public class CostumAdapter2 extends FragmentStatePagerAdapter {

        final int PAGE_COUNT = 10;
        private String tabTitles[] = new String[] {"TAB0", "TAB1", "TAB2", "TAB3", "TAB4", "TAB5", "TAB6", "TAB7", "TAB8", "TAB9"};

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

        @Override
        public Fragment getItem(int position) {
            Bundle bundle = new Bundle();

            switch (position) {
                case 0:

                    FragmentBebidas fragmentBebidas = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas.setArguments(bundle);
                    return fragmentBebidas;

                case 1:
                    FragmentBebidas fragmentBebidas2 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas2.setArguments(bundle);
                    return fragmentBebidas2;

                case 2:
                    FragmentBebidas fragmentBebidas3 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas3.setArguments(bundle);
                    return fragmentBebidas3;


                case 3:
                    FragmentBebidas fragmentBebidas4 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas4.setArguments(bundle);
                    return fragmentBebidas4;


                case 4:
                    FragmentBebidas fragmentBebidas5 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas5.setArguments(bundle);
                    return fragmentBebidas5;


                case 5:
                    FragmentBebidas fragmentBebidas6 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas6.setArguments(bundle);
                    return fragmentBebidas6;


                case 6:
                    FragmentBebidas fragmentBebidas7 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas7.setArguments(bundle);
                    return fragmentBebidas7;


                case 7:
                    FragmentBebidas fragmentBebidas8 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas8.setArguments(bundle);
                    return fragmentBebidas8;


                case 8:
                    FragmentBebidas fragmentBebidas9 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas9.setArguments(bundle);
                    return fragmentBebidas9;
                case 9:
                    FragmentBebidas fragmentBebidas10 = new FragmentBebidas();
                    bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
                    fragmentBebidas10.setArguments(bundle);
                    return fragmentBebidas10;
            }

            return null;    
        }

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

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

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
}

仅供参考,根据您的需要更改 tabTitles(TAB0, TAB1.....)

更新onCreateView()如下:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.menu_layout, container, false);

    tabLayout = (TabLayout) rootView.findViewById(R.id.tablayout_menu);
    viewPager = (ViewPager) rootView.findViewById(R.id.viewPager_menu);

    CostumAdapter2  costumAdapter =  new CostumAdapter2(getActivity().getSupportFragmentManager());
    viewPager.setAdapter(costumAdapter);
    tabLayout.setupWithViewPager(viewPager);

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

    });

    return rootView;
}

希望对你有帮助~

【讨论】:

  • 实际上这些值是从另一个web服务获取的 Private String tabTitles [] = new String [] {TAB0, TAB1, TAB2, TAB3, TAB4, TAB5, TAB6, TAB7, TAB8, } ;标题的名称和大小可能会有所不同
  • @Overridepublic int getItemPosition (Object object) {return POSITION_NONE; } 有了这个,欧元就更频繁了:(
  • 这个不用加。您可以删除此代码部分
  • 解决方案全部传递给受保护的 void onPostExecute viewPager = (ViewPager) rootView.findViewById(R.id.viewPager_menu); costumAdapter = new CostumAdapter2(getActivity().getSupportFragmentManager()); costumAdapter.notifyDataSetChanged(); viewPager.setAdapter(costumAdapter); tabLayout = (TabLayout) rootView.findViewById(R.id.tablayout_menu);tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { ........
【解决方案2】:

您将MenuViewController.CostumAdapter2 声明为内部类。当您更改MenuViewController.menuTabs 的内容时,您还必须在每个适配器上调用notifyDataSetChanged()

由于您甚至在您的 MenuViewController 中都没有提及它,这可能很难。

尝试将适配器实现为MenuViewController 中的单例,并在更改menuTabs 时调用notifyDataSetChanged()

【讨论】:

  • MenuViewController.menuTabs 部分没看懂??那不在我的代码中
  • 是的。在这种情况下,这只是假设。您在代码中引用了menuTabs。但是缺少声明。重点是,您更改了menuTabs 的内容而没有通知适配器。
猜你喜欢
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多