Android 如何在视图寻呼机中更改选项卡时更新列表

Android 如何在视图寻呼机中更改选项卡时更新列表,android,tabs,android-viewpager,Android,Tabs,Android Viewpager,在我的应用程序中,我正在使用导航选项卡和查看寻呼机。我已经能够使用发布在上的代码成功绘制选项卡: 在这里,我使用了滑动选项卡和查看寻呼机来获取导航选项卡。一切正常,但当我移动到另一个选项卡时,列表没有得到更新。OnResume()被调用,即使对象列表变量在调试时也会更新,但列表不会更新 下面是一些代码片段: 对于Tab1:在我的情况下,哪个是活动选项卡 在选项卡2上:哪个是存档选项卡 在主要活动中: public class MaterialTab extends FragmentActivi

在我的应用程序中,我正在使用导航选项卡和查看寻呼机。我已经能够使用发布在上的代码成功绘制选项卡:

在这里,我使用了滑动选项卡和查看寻呼机来获取导航选项卡。一切正常,但当我移动到另一个选项卡时,列表没有得到更新。OnResume()被调用,即使对象列表变量在调试时也会更新,但列表不会更新

下面是一些代码片段:

对于Tab1:在我的情况下,哪个是活动选项卡

在选项卡2上:哪个是存档选项卡

在主要活动中:

public class MaterialTab extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.material_main_sample);
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager()));
        PagerSlidingTabStrip tabsStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs);
        tabsStrip.setViewPager(viewPager);
        tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                if(position == 0){
                   ActiveFragment activeFragment = new ActiveFragment();
                    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                    ft.detach(activeFragment);
                    ft.attach(activeFragment);
                    ft.commit();
                } if(position == 1){
                    ArchiveFragment archiveFragment = new ArchiveFragment();
                    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                    ft.detach(archiveFragment);
                    ft.attach(archiveFragment);
                    ft.commit();
                }
            }
        });
    }
}
还有一件事是,当我做SwipeRefresh时,列表会更新。我现在完全不明白为什么会有这种行为。当我滑动选项卡时,会调用相同的方法,并且列表不会更新,但当我执行SwiperFresh时,列表会更新

这是活动片段:

public class ActiveFragment extends Fragment {

public void updateFragment(){
        new GetUsersArchivedFromServerTask().execute();
    }

 public class GetUsersArchivedFromServerTask extends AsyncTask<User, Void, String> {
        @Override
        protected String doInBackground(Shipment... parmas) {
            // Log.d(TAG, String.valueOf(shipmentDbHandler.getAllActiveShipments().size()));
            _userList1 = userDbHandler.getAllActiveUserByToday(DateTimeUtil.getCurrentTime());
            return "";
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(String str) {
            // Set the refresh Listener to false after the list has been loaded with new set of data
            if (mSwipeRefreshLayout.isRefreshing()) {
                mSwipeRefreshLayout.setRefreshing(false);
            }

            if(_userList1.size() == 0){
                ViewGroup parentOne = (ViewGroup) viewOne.getParent();
                if(parentOne != null){
                    parentOne.removeView(viewOne);
                }
            }

            if(_shipmentList1.size() > 0 ){
                mShipmentAdapter = new ShipmentAdapter(getActivity(),_userList1,1); 
                shipmentListView1.setAdapter(mShipmentAdapter);
                setListViewHeightBasedOnChildren(shipmentListView1);
                ViewGroup parentOne = (ViewGroup) viewOne.getParent();
                if(parentOne == null){
                    mainLayoutOne.addView(viewOne);
                }

                mShipmentAdapter.notifyDataSetChanged();
            }
            mSwipeRefreshLayout.setClickable(true);
        }
    }
}   
公共类ActiveFragment扩展了片段{
公共无效更新标签(){
新GetUsersArchivedFromServerTask().execute();
}
公共类GetUsersArchivedFromServerTask扩展了AsyncTask{
@凌驾
受保护的字符串背景(装运…帕尔马){
//Log.d(TAG,String.valueOf(shipmentDbHandler.getAllActiveShipments().size());
_userList1=userDbHandler.getAllActiveUserByToday(DateTimeUtil.getCurrentTime());
返回“”;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的void onPostExecute(字符串str){
//使用新数据集加载列表后,将刷新侦听器设置为false
if(mSwipeRefreshLayout.isRefreshing()){
mSwipeRefreshLayout.setRefresh(false);
}
如果(_userList1.size()==0){
ViewGroup parentOne=(ViewGroup)viewOne.getParent();
if(parentOne!=null){
parentOne.removeView(viewOne);
}
}
如果(_shipmentList1.size()>0){
mShipmentAdapter=newshipmentadapter(getActivity(),_userList1,1);
shipmentListView1.setAdapter(mShipmentAdapter);
setListViewHeightBasedOnChildren(shipmentListView1);
ViewGroup parentOne=(ViewGroup)viewOne.getParent();
if(parentOne==null){
mainLayoutOne.addView(viewOne);
}
mShipmentAdapter.notifyDataSetChanged();
}
mSwipeRefreshLayout.setClickable(真);
}
}
}   

请使用
FragmentStatePagerAdapter

您的
OnPageChangeListener
正在拧紧片段。每次选择页面时,您都会创建一个新的
片段
,并始终添加它。。您正在尝试分离尚未连接的新
片段。完全搞砸了。您的
SampleFragmentPagerAdapter
将为您处理这些片段事务。所以只要删除你的
setOnPageChangeListener
,一切都会好起来。

尝试使用notifyDataChange或notifyall

在你的片段中使用它

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser) {
        // Do your code here
    }
}

每当用户看到选项卡时,都会调用此方法。希望这能解决你的问题

这里有一个简单有效的解决方案。只需像这样替换setOnPageChangeListener,这里我们在getSupportFragmentManager的帮助下访问当前片段的实例,并调用相应的片段方法

    tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            Fragment currentFragment = getSupportFragmentManager()
                    .findFragmentByTag(
                            "android:switcher:" + R.id.viewpager + ":"
                                    + mViewPager.getCurrentItem());
            if (currentFragment instanceof ActiveFragment) {
                ((ActiveFragment) currentFragment).updateFragment();
            } else if (currentFragment instanceof ArchiveFragment) {
                ((ArchiveFragment) currentFragment).updateFragment();
            }
        }
    });
public void updateFragment() {
    Toast.makeText(getActivity(), "ActiveFragment", Toast.LENGTH_SHORT)
            .show();
    // make updates over here
    // new GetUsersArchivedFromServerTask().execute(); // Network calls
}
在各自的片段中放入updateFragment()方法


参考资料

覆盖
setPrimaryItem()
并在该位置调用片段的
refresh()
方法<每次在
viewPager
中更改所选项目时,都会调用code>setPrimaryItem()
。它可能会被多次调用,因此您也必须处理它。 见:

我希望这有帮助

  • 从页面更改列表中删除所选(…)的
    onPageSelected(…)
    代码,无需手动附加/删除,
    ViewPager
    自动注意这一点。而且您的
    SampleFragmentPagerAdapter
    应该在
    getItem(…)
    中创建每个片段实例

  • 应在每个片段的
    onCreateView
    中调用
    new GetUsersFromServerTask().execute()
    ,然后在
    Asynctask
    完成后更新视图


  • 此外,您应该了解
    屏幕外的电子邮件限制

    公共无效设置OffScreenPageLimit(整数限制)

    设置在空闲状态下视图层次结构中当前页面两侧应保留的页数。超出此限制的页面将在需要时从适配器重新创建

    这是作为一种优化提供的。如果您事先知道需要支持的页面数量,或者页面上有延迟加载机制,调整此设置可以提高页面动画和交互的平滑度。如果您有少量页面(3-4个)可以同时保持活动状态,则在用户页面来回移动时,新创建的视图子树的布局所花费的时间将更少

    您应该将此限制保持在较低的水平,尤其是在页面布局复杂的情况下。此设置默认为1


    view pager也加载了一个片段,所以onResume方法将被调用,所以当你滑动到该片段时,onResume未被调用,againI尝试了这种方法,但它为其余元素提供了空指针异常你说的“其余元素”是什么意思?其余元素在布局中表示我已SwiperFresh。。然后,所有这些按钮都会给出空指针,除非我请求您将该片段类放入您的问题中,以便
        tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                Fragment currentFragment = getSupportFragmentManager()
                        .findFragmentByTag(
                                "android:switcher:" + R.id.viewpager + ":"
                                        + mViewPager.getCurrentItem());
                if (currentFragment instanceof ActiveFragment) {
                    ((ActiveFragment) currentFragment).updateFragment();
                } else if (currentFragment instanceof ArchiveFragment) {
                    ((ArchiveFragment) currentFragment).updateFragment();
                }
            }
        });
    
    public void updateFragment() {
        Toast.makeText(getActivity(), "ActiveFragment", Toast.LENGTH_SHORT)
                .show();
        // make updates over here
        // new GetUsersArchivedFromServerTask().execute(); // Network calls
    }