android-从导航栏替换ViewPager中的片段
我正在开发一个Android应用程序,可以查看曲棍球比赛的结果。 我使用带有自定义android-从导航栏替换ViewPager中的片段,android,android-fragments,android-viewpager,android-cardview,fragmentmanager,Android,Android Fragments,Android Viewpager,Android Cardview,Fragmentmanager,我正在开发一个Android应用程序,可以查看曲棍球比赛的结果。 我使用带有自定义FragmentPagerAdapter的ViewPager来显示三个片段,使用带有ExpandableListView的NavigationDrawer来显示锦标赛。 当我点击ExpandableListViewchildrens时,我想用所选锦标赛的数据更新这三个片段 我在NavigationDrawer中设置了一个OnchildClickListener,其中我指示了一个FragmentManager,并调用
FragmentPagerAdapter
的ViewPager
来显示三个片段,使用带有ExpandableListView
的NavigationDrawer
来显示锦标赛。
当我点击ExpandableListView
childrens时,我想用所选锦标赛的数据更新这三个片段
我在NavigationDrawer
中设置了一个OnchildClickListener
,其中我指示了一个FragmentManager
,并调用了replace()
方法。但它只是返回一个空白屏幕
我搜索了每个论坛,尝试了不同的解决方案,但没有一个是有效的
当我使用ft.add()
而不是ft.replace()
并使用SwipeRefreshLayout
刷新页面时,我得到了正确的结果,但我不想手动刷新页面。
我还试图用FragmentStatePagerAdapter
替换FragmentPagerAdapter
,但没有任何改变
导航抽屉碎片
我将向您展示的是一种非常基本的更新
ViewPager
片段的方法,每次数据更改时都用新实例替换现有片段
这是公式:
- 允许
获取一些更新的数据。在您的例子中,有一个名为“key”的int值,当用户从导航抽屉中选择一个项目时,该值会更新。我们将在您的FragmentPagerAdapter
上放置一个方法,该方法将接受一个键值参数并开始更新FragmentPagerAdapter
- 在
上执行FragmentPagerAdapter
以返回getItemPosition()
。这将告诉POSITION\u NONE
当前片段已过期,需要用另一个片段替换ViewPager
- 在适配器的
方法中,在实例化新片段时使用当前键值。(您已经拥有此部件。)getItem()
活动
,以便有一个对FragmentPagerAdapter
实例的引用
private MyFragmentPagerAdapter mAdapter;
活动中
,确保您的查看页面
已使用您的FragmentPagerAdapter
设置。(您没有发布您的活动
代码,因此请确保您没有错过此内容。)这可能会发生在onCreate()
中
活动中
以接受来自导航抽屉的键值并将其传递到适配器(我们将在一分钟内处理适配器):
FragmentTransaction
代码onChildClick()
:
您的MyFragmentPagerAdapter
将为您执行所有这些片段管理。因此,将该代码替换为:
((MainActivity) getActivity()).select(key);
(我不知道你的活动叫什么,所以我只使用了MainActivity
作为例子。)FragmentPagerAdapter
上的getItemPosition()
,使其始终返回POSITION\u NONE
:
public int getItemPosition(Object object) {
return POSITION_NONE;
}
必须重写此方法,因为基类方法只返回POSITION\u UNCHANGED
,这将导致永远不会调用getItem()
FragmentPagerAdapter
上添加获取键值的方法。您已经有一个键的变量,因此可以使用该变量存储值:
public void setKey(int key) {
idcampionato = key;
notifyDataSetChanged();
}
- 用户从导航抽屉中选择项目
onChildClick()
调用适配器上的select()
setKey()
- 适配器存储键值并调用notifyDataSetChanged()
注意到适配器已更改,并通过调用适配器的ViewPager
来查看片段数是否已更改getCount()
在每个页面位置调用ViewPager
<返回code>POSITION\u NONE,它告诉getItemPosition()
需要删除该页面上的片段并用新片段替换ViewPager
然后在每个页面位置调用ViewPager
。这将调用片段的getItem()
方法。由于您的newInstance
值已更新,因此将使用新键创建片段idcampionato
显示带有更新数据的新片段ViewPager
这并不像我最初建议的那样优雅,即只创建一次片段,然后在片段上有一个自定义方法来更新键和刷新片段视图。但是这种方法需要对代码进行更多的更改,所以我决定采用更简单的解决方案。对不起,我不明白这一点……我可以在哪里保存片段的引用以及如何保存?非常感谢。告诉你,发布你的
PagerAdapter
子类,我会更新我的答案。更新我的答案;抱歉花了这么长时间。。。我为您详细介绍了一个更简单的解决方案。干杯,非常感谢你!您的代码完全可以工作,但是我添加了一个事务来删除前面的片段以使其工作。另外,无论我点击什么,它都显示了相同的片段。嗯,这很奇怪。。。FragmentPagerAdapter
应该为您处理所有片段事务。。。我很想看看你的更新代码。如果您愿意,请在问题中发布您的最新代码。但是,嘿,如果你对结果感到满意,并且你只想结束这一天,我很乐意。:)
mAdapter = new MyFragmentPagerAdapter();
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
public void select(int key) {
mAdapter.setKey(key);
}
//gets Fragment Manager
FragmentManager fragmentManager = getFragmentManager();
//starts the transaction
android.support.v4.app.FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.viewpager, PagePartite.newInstance(key)); //first page
ft.replace(R.id.viewpager, PageClassifica.newInstance(key)); //second page
ft.replace(R.id.viewpager, PageStatistiche.newInstance(key));
ft.addToBackStack(null);
ft.commit();
((MainActivity) getActivity()).select(key);
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public void setKey(int key) {
idcampionato = key;
notifyDataSetChanged();
}