【问题标题】:How to refresh a Fragment of a FragmentPagerAdapter?如何刷新 FragmentPagerAdapter 的片段?
【发布时间】:2013-09-13 15:07:47
【问题描述】:

我使用 TabPageIndicatorFragmentPagerAdapter 库有 2 个选项卡,名为 tab1(主页)和 tab2(配置文件)。

在 tab2 中,我有一个名为“登录”的按钮(tab2 膨胀 abc.xml)。

当用户点击“登录”按钮时,应用程序将在新活动中显示登录表单。 登录后,活动结束,tab2 的内容视图将更改(它显示用户的个人资料,因为它会膨胀xyz.xml)。我该怎么做?

public class MainActivity extends SherlockFragmentActivity {
    private static String[] TAB_NAMES = null;
    private Context context = this;
    private static FragmentPagerAdapter adapter ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        if (TAB_NAMES == null) {
            TAB_NAMES = new String[] {
                    getResources().getString(R.string.tab_home),
                    getResources().getString(R.string.tab_profile) };
        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter = new TabsAdapter(
                getSupportFragmentManager());

        ViewPager pager = (ViewPager) findViewById(R.id.pager);

        pager.setAdapter(adapter);


        TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator);
        indicator.setViewPager(pager);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater infalter = getSupportMenuInflater();
        infalter.inflate(R.menu.main_menu, menu);
        return true;
    }

    class TabsAdapter extends FragmentPagerAdapter {
        public TabsAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return HomeFragment.getInstance();
            case 1:
                return new ProfileFragment();

            default:
                return HomeFragment.getInstance();
            }
        }
        }

【问题讨论】:

  • 你试过FragmentStatePagerAdapter吗?
  • 不,我没有,你能告诉我如何使用它吗?请编辑我上面的代码。
  • 尝试将 TabsAdapter 扩展到 FragmentStatePagerAdapter 而不是 FragmentPagerAdapter 。所以它会像class TabsAdapter extends FragmentStatePagerAdapter
  • 好吧,在完成登录活动之后。为了将 abc.xml 切换到 xyz.xml 我必须做什么?

标签: android android-fragments android-tabs


【解决方案1】:

您可以使用 FragmentStatePagerAdapter 代替 FragmentPagerAdapter

你可以这样试试:

private static FragmentStatePagerAdapter adapter ;
private static String[] TAB_NAMES = null;

@Override
protected void onCreate(Bundle savedInstanceState) {

    if (TAB_NAMES == null) {
        TAB_NAMES = new String[] {
                getResources().getString(R.string.tab_home),
                getResources().getString(R.string.tab_profile) };
    }
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    adapter = new FragmentStatePagerAdapter(getSupportFragmentManager()) {
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return HomeFragment.getInstance();
                case 1:
                    return new ProfileFragment();

                default:
                    return HomeFragment.getInstance();
            }
        }

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

        @Override
        public int getItemPosition(Object fragItem) {
            int position = 0;
            if (fragItem instanceof HomeFragment) {
                position = 0;
            } else if (fragItem instanceof  ProfileFragment) {
                position = 1;
            }
            return (position >= 0) ? position : POSITION_NONE;
        }
    }

    ViewPager pager = (ViewPager) findViewById(R.id.pager);
    pager.setAdapter(adapter);


    TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator);
    indicator.setViewPager(pager);

}

参考

您可以查看this解决方案。

【讨论】:

  • 感谢您的警告@GhostCat
  • 感谢您处理我的反馈的完美方式 ;-)
【解决方案2】:

您可以使用 startActivityForResult(或广播/接收器)从活动中获取结果。 然后使用 adapter.notifyDataSetChanged 刷新片段。

关于刷新 ViewPager,更详细:

ViewPager PagerAdapter not updating the View

【讨论】:

    【解决方案3】:

    我也遇到了同样的问题,所以我在路上解决了:

    只需通过重写 onResume 方法来刷新您的 HomeFragment 或 ProfileFragment。

    在 onResume 方法中,您可以轻松刷新 ListFragment 或 Fragment。

    【讨论】:

      【解决方案4】:

      我已经尝试了很多我在 google 和 stackoverflow 中找到的关于这个问题的解决方案。他们都没有正常工作。官方谷歌安卓开发者页面中的教程也不起作用。

      我在我的应用程序中实现了 ViewPageIndicator 并尝试创建一个图像滑块。我有图像的动态网址来自服务回调成功。所以我必须在 OnResume 中设置我的 viewpager 适配器和指示器。当我设置一切正常时,我在 onResume 中加载片段,在 OnStop 之后我重新加载它们。但是当我将应用程序发送到后台并打开其他一些应用程序时,我意识到在 onResume 之后我的滑块无法重新加载图像。

      在浪费我的时间之后,我试图通过记录和调试 onCreateView 和 onResume 事件来清楚地了解我在 fragmentpageradapter getItem 中创建的片段的生命周期。

      如果你像

      这样创建你的片段
      Fragment myFragment = new Fragment(url,position);
      

      在您停止活动并打开其他一些应用程序后,您会丢失在自定义片段的构造函数中设置的变量。当我意识到这种情况时,我尝试了捆绑方法。

      这是我的自定义 FragmentPagerAdapter(我使用了 google 的示例)

      public class ScreenSlidePageAdapter extends FragmentPagerAdapter implements IconPagerAdapter {
      
              ArrayList<String> urls;
      
              public ScreenSlidePageAdapter(ArrayList<String>urls,FragmentManager fm) {
                  super(fm);
                  this.urls = urls;
                  fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
              }
      
              @Override
              public Fragment getItem(int position) {
                  SliderFragment sliderFragment = new SliderFragment();
                  Bundle bundle = new Bundle();
                  bundle.putString("url",urls.get(position));
                  sliderFragment.setArguments(bundle);
                  return sliderFragment;
              }
      
          @Override
          public int getIconResId(int index) {
              return R.drawable.notification_circle;
          }
      
          @Override
          public int getCount() {
              return this.urls.size();
          }
      
      } 
      

      我的自定义 FragmentPagerAdapter 实现了 IconPagerAdapter。小心点。

      还有我的自定义 SliderFragment:

      public class SliderFragment extends Fragment {
      
          private String url;
          private int position;
          private boolean clickable;
      
          public SliderFragment() {
          }
      
          public SliderFragment(String url, int position, boolean clickable) {
      
              this.url = url;
              //this.position = position;
              //this.clickable = clickable;
          }
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
          }
      
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
              View rootView = inflater.inflate(R.layout.layout_fragment_slider, container, false);
      
      
                  this.url = getArguments().getString("url");
      
                  ImageView imageView = (ImageView) rootView.findViewById(R.id.iv_image);
                  com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(Constants.URL_PREFIX + url, imageView);
      
      
                      imageView.setOnClickListener(new View.OnClickListener() {
                          @Override
                          public void onClick(View v) {
                              Intent intent = new Intent(getActivity(),SliderActivity.class);
                              intent.putExtra("url",url);
                              startActivity(intent);
                              getActivity().overridePendingTransition(R.anim.anim_slide_in_left,
                                      R.anim.anim_slide_out_left);
                          }
                      });
      
      
              return rootView;
          }
      

      最后是加载滑块项的 loadSlider 方法

      private void loadSlider() {
      
              pager = (ViewPager) findViewById(R.id.dealdetailpager);
      
              ScreenSlidePageAdapter screenSlidePageAdapter = new ScreenSlidePageAdapter(dealDetail.getImages(),getSupportFragmentManager());
              pager.setAdapter(screenSlidePageAdapter);
      
              circlePageIndicator = (CirclePageIndicator) findViewById(R.id.indicator);
              circlePageIndicator.setViewPager(pager);
      
              sliderThread = new SliderThread(true, 0);
              sliderThread.start();
          }
      

      我无法检查我的滑块片段是否正在更新,但至少片段在 OnStop 之后存在,这就是我最需要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多