更新视图寻呼机中更改的选项卡上的内容

Updating the contents on tab changed in view pager

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

在这两个选项卡中都有 listView。单击 USER-TAB 上的 ListItem 时,会出现一个对话框,用户可以执行一些操作。

Now after this when the ADMIN-TAB is Selected the Admin should get refreshed with new sets of data.但事实并非如此。在选择 ADMIN-TAB 时,onResume() 方法和 everyting 被调用,但它无法更新列表。

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

在 My Main Activity 我写了 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 您可以看到我正在分离和重新连接 fragment.Everything 工作正常。两个 Fragments OnResume() 都被调用,但 List 没有改变。我不明白为什么

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

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];
    }
}

哈.. 在输了将近 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() // Now this is the real 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() 也应该被调用。希望它能帮助别人。为了更好的性能,您可以根据您的要求进行更改。

我从这个post得到了需要的突破和理解:@Louth回答
Remove Fragment Page from ViewPager in Android

就把

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) {

        }
    });