如何更新列表,只要选项卡在浏览器中更改

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

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

在这里我已经使用滑动选项卡和查看寻呼机都得到导航选项卡。一切工作正常,但列表并没有得到更新,当我移动到另一个选项卡。 OnResume()被调用,即使对象列表variables也在debugging时得到更新,但视觉列表没有得到更新。

在这里,我是一些代码片段:

对于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 } } 

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

  @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然后列表得到更新。 我现在完全搞不懂这种行为。 当我滑动选项卡相同的方法被调用和列表没有得到更新,但是当我做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); } } } 

Solutions Collecting From Web of "如何更新列表,只要选项卡在浏览器中更改"

为此,请使用FragmentStatePagerAdapter

您的OnPageChangeListener正在与碎片拧紧。 每次select一个页面,你都会创build一个新的Fragment并且总是添加它..你试图分离一个尚未附加的新Fragment 。 它完全搞砸了。 您的SampleFragmentPagerAdapter将为您处理这些片段事务。 所以只要删除你的setOnPageChangeListener ,一切都应该没问题。

这是一个简单而有效的解决scheme。 只需要像这样replacesetOnPageChangeListener,在这里我们通过getSupportFragmentManager的帮助访问当前片段的实例,并调用相应的fragment方法。

  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 } 

参考链接 。

  1. 从页面转换器中删除onPageSelected(...)代码,不需要手工启动/encryption, ViewPager自动处理这个。 而且你的SampleFragmentPagerAdapter应该在getItem(...)创build每个Fragment实例。

  2. 应该在每个Fragment的onCreateView调用new GetUsersFromServerTask().execute() ,然后在完成Asynctask之后更新视图。

另外,你应该知道OffscreenPageLimit

public void setOffscreenPageLimit(int limit)

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

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

你应该保持低限,特别是如果你的网页有复杂的布局。 该设置默认为1。

在你的片段中使用这个。

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // Do your code here } } 

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

尝试使用notifyDataChange或notifyall

重写setPrimaryItem()并在该位置调用片段的refresh()方法。 setPrimaryItem()select的项目在viewPager更改时, viewPager调用setPrimaryItem() 。 它可能被称为不止一次,所以你也必须处理它。 请参阅: setPrimaryItem

我希望这有帮助。