【问题标题】:Updating the contents on tab changed in view pager更新视图寻呼机中更改的选项卡上的内容
【发布时间】:2015-05-21 08:41:56
【问题描述】:

过去 1 天我一直在摸索,但找不到解决方案。 在我的应用程序中,工具栏下有两个选项卡

  • 第一个标签是 USER-TAB
  • 第二个是ADMIN-TAB

在两个选项卡中都有 listView。当单击 USER-TAB 上的 ListItem 时,会出现一个对话框并且用户采取一些操作。

现在在选择“管理”选项卡后,管理员应使用新的数据集刷新。但事实并非如此。在选择 ADMIN-TAB 时,onResume() 方法和everyting 都会被调用,但它无法更新列表。

我将无法编写整个代码,我给出了一些 sn-p。 基本上我已经从这个链接中获取了代码
https://github.com/codepath/android_guides/wiki/Sliding-Tabs-with-PagerSlidingTabStrip

在我的主要活动中,我编写了 OpPageChangeListener。

public class MaterialTab extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.material_main_sample);
        // Get the ViewPager and set it's PagerAdapter so that it can display items
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager()));
        // Give the PagerSlidingTabStrip the ViewPager
        PagerSlidingTabStrip tabsStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs);
        // Attach the view pager to the tab strip
        tabsStrip.setViewPager(viewPager);
        tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int position) {
                if(position == 0){
                    MileUserFragment userFragment = new MileUserFragment();
                    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                    ft.detach(userFragment);
                    ft.attach(userFragment);
                    ft.commit();
                } if(position == 1){
                    MileAdminFragment adminFragment = new MileAdminFragment();
                    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                    ft.detach(adminFragment);
                    ft.attach(adminFragment);
                    ft.commit();
                }
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }
}

OnPageSelected 您可以看到我正在分离并重新附加片段。一切正常。两个 Fragments OnResume() 都被调用,但列表没有改变。我不明白为什么

为了获得更多帮助,我将添加 sn-p 一个片段。希望这会给我一些想法,我可能会出错

public class MileUserFragment extends Fragment {
@Override
    public void onResume() {
        super.onResume();
        new GetAdminDbTask().execute();

        if(!internetUtil.isConnectedToInternet(getActivity())){
            mSwipeRefreshLayout.setRefreshing(false);
            mSwipeRefreshLayout.setEnabled(false);
        }
    }

 public class GetAdminDbTask extends AsyncTask<Admin, Void, String> {
        @Override
        protected String doInBackground(Admin... parmas) {
            _adminList = shipmentDbHandler.getAllAdmin();
            return "";
        }
        @Override
        protected void onPostExecute(String str) {
            mAdminAdapter = new AdminAdapter(getActivity(), _adminList);
            adminListView.setAdapter(mAdminAdapter);
            mAdminAdapter.notifyDataSetChanged();
            // Set the refresh Listener to false after the list has been loaded with new set of data
            if (mSwipeRefreshLayout.isRefreshing()) {
                mSwipeRefreshLayout.setRefreshing(false);
            }

            if(_adminList.size() > 0 ){
                mAdminAdapter = new AdminAdapter(getActivity(), _adminList);
                adminListView.setAdapter(mAdminAdapter);
                mAdminAdapter.notifyDataSetChanged();
            }
        }
    }
}

public class SampleFragmentPagerAdapter extends FragmentPagerAdapter {
    final int PAGE_COUNT = 2;
    private String tabTitles[] = new String[] { "Tab1", "Tab2" };
    private FragmentManager fragmentManager;

    public SampleFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
        this.fragmentManager = fm;
    }

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

    @Override
    public Fragment getItem(int position) {
        FragmentTransaction ft = null;
        if(position == 0){
            MileUserFragment userFragment = new MileUserFragment();
            return userFragment;

        }
        if(position == 1){
            MileAdminFragment adminFragment = new MileAdminFragment();
            return archiveFragment;
        }

    }

    @Override
    public CharSequence getPageTitle(int position) {
        // Generate title based on item position
        return tabTitles[position];
    }
}

【问题讨论】:

  • 我相信像你这样使用attachdetach 是不正确的。您正在寻找的是 replace 方法。
  • @curtisLoew .. 这是我在网上找到的最接近的方法,否则在它甚至没有调用 onResume 之前。对于替换部分,我需要用标签设置片段..我不知道该怎么做

标签: android tabs android-viewpager fragment pagerslidingtabstrip


【解决方案1】:

哈.. 在失去了将近 1 天半的时间后,我终于得到了答案。这可能不是完全好的答案,但至少它是我得到的最接近的答案之一。

首先 MainActivity.java 看起来像:

 tabs.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            int scrollPosition = 0;
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                if(position == 0){
                    scrollPosition = 0;
                }
                if(position == 1){
                    scrollPosition = 1;
                }
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                if(state == pager.SCROLL_STATE_IDLE){
                    if(scrollPosition == 0 && application.isActiveAction()){
                        viewPagerAdapter.notifyDataSetChanged();
                        application.setActiveAction(false);
                    }

                    if(scrollPosition == 1 && application.isArchiveAction()){
                        viewPagerAdapter.notifyDataSetChanged();
                        application.setArchiveAction(false);
                    }
                }
            }
        });

现在我在这里所做的是我设置了 OnPageChangeListener 并且在此我会在选项卡更改时跟踪位置。对于我的需要,我已经创建了两个布尔变量,并在这些选项卡上的任何内容在应用程序范围内发生变化时设置它。现在,当一个选项卡上的内容已更改或某些操作完成时,我正在调用

viewPagerAdapter.notifyDataSetChanged() // 现在这是真正的 gem

在调用它之后,它将调用 ViewPagerAdapter 函数

@Override
    public int getItemPosition(Object object) {
        return PagerAdapter.POSITION_NONE;  // This will get invoke as soon as you call notifyDataSetChanged on viewPagerAdapter.
    }

还有一点是你的 ViewPagerAdapter 应该扩展 FragmentStatePageAdapter。现在重点是

PagerAdapter.POSITION_NONE

不会缓存片段并为该选项卡位置重新加载新片段。 基本思想是我们不应该在每次滑动选项卡时都创建或返回 PagerAdapter.POSITION_NONE,因为它会破坏缓存的元素并重新加载影响 UI 性能的片段。

所以最后基本的事情是始终检查是否在调用 viewPagerAdapter.notifyDataSetChanged() 函数 getItemPosition() 也应该被调用。希望它会帮助某人。为了获得更好的性能,您可以根据自己的要求进行更改。

我从这篇文章中获得了所需的突破和理解:@Louth 回答
Remove Fragment Page from ViewPager in Android

【讨论】:

  • 什么是应用程序?
  • @Hoo application 是一个变量,它是一个 ApplicationContext 对象。在我的应用程序中,我在 ApplicationContext 中维护了两个方法 setActiveAction() 和 setArchiveAction() ,这样每当我的选项卡更改时,我都可以通知它。在这两个选项卡中是 ACTIVE 和 ARCHIVE。
【解决方案2】:

随便放

viewPager.setCurrentItem(tab.getPosition());

在您的 onTabSelected 方法中,例如:

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

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多