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

时间:2015-05-14 06:55:37

标签: android tabs android-viewpager

在我的应用程序中,我使用视图寻呼机的导航选项卡。我能够使用发布在以下位置的代码成功绘制标签:

https://github.com/codepath/android_guides/wiki/Sliding-Tabs-with-PagerSlidingTabStrip

在这里,我使用了Sliding选项卡和查看分页器来获取导航选项卡。一切正常,但是当我移动到另一个选项卡时,列表没有得到更新。 OnResume()被调用,即使对象列表变量也在调试时更新,但可视化列表没有得到更新。

这里我是代码的一些片段:

  

对于Tab1:在我的情况下是ACTIVE选项卡

 @Override
    public void onResume() {
        super.onResume();

        if(!internetUtil.isConnectedToInternet(getActivity())){
            mSwipeRefreshLayout.setEnabled(false);
        }else{
            mSwipeRefreshLayout.setEnabled(true);
            new GetUsersFromServerTask().execute();  // Here i am making the network calls 
        }
}
  

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

 @Override
    public void onResume() {
        super.onResume();
        new GetUsersArchivedFromServerTask().execute(); // Network calls
    }

在MainActivity中:

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时,List也会更新。我现在完全糊涂了为什么这种行为。当我滑动选项卡时,相同的方法被调用,并且该列表没有得到更新,但是当我正在进行SwipeRefresh时,它正在更新。

这是活动碎片:

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

7 个答案:

答案 0 :(得分:4)

为此使用FragmentStatePagerAdapter

答案 1 :(得分:3)

你的OnPageChangeListener正在搞碎片。每次选择页面时,您都会创建一个新的Fragment并始终添加它...您尝试分离尚未附加的新Fragment。它完全搞砸了。您的SampleFragmentPagerAdapter将为您处理这些片段交易。所以只需删除你的setOnPageChangeListener,一切都会好的。

答案 2 :(得分:3)

这是一个简单而有效的解决方案。只需像这样替换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();
            }
        }
    });

在各自的片段中放入updateFragment()方法。

public void updateFragment() {
    Toast.makeText(getActivity(), "ActiveFragment", Toast.LENGTH_SHORT)
            .show();
    // make updates over here
    // new GetUsersArchivedFromServerTask().execute(); // Network calls
}

参考link

答案 3 :(得分:2)

  1. 从页面更改listerner中删除onPageSelected(...)代码,无需手动连接/卸载,ViewPager自动处理此问题。此外,SampleFragmentPagerAdapter应在getItem(...)中创建每个Fragment实例。

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


  4. 此外,您应该了解OffscreenPageLimit

      

    public void setOffscreenPageLimit(int limit)

         

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

         

    这是作为优化提供的。如果您事先知道需要支持的页面数量或在页面上使用延迟加载机制,那么调整此设置可以获得分页动画和交互的感知平滑性。如果您有少量页面(3-4)可以一次保持活动状态,那么当用户来回翻页时,新创建的视图子树的布局花费的时间会更少。

         

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

答案 4 :(得分:1)

在片段中使用此内容。

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

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

每次选项卡对用户可见时,都会调用此方法。希望这能解决你的问题!!!!

答案 5 :(得分:0)

尝试使用notifyDataChange或notifyall

答案 6 :(得分:0)

覆盖setPrimaryItem()并在该位置调用片段的refresh()方法。每次所选项目在setPrimaryItem()中更改时,都会调用viewPager。它可能不止一次被调用,所以你也必须处理它。 见:setPrimaryItem

我希望这会有所帮助。