Android viewpager中的替换片段不工作
在我的项目中,我使用actionbar和SwipeableThreeFragments(带viewpager的选项卡),我试图用第四个片段替换其中一个片段,但我无法得到它Android viewpager中的替换片段不工作,android,android-fragments,android-viewpager,fragmentstatepageradapter,fragmentmanager,Android,Android Fragments,Android Viewpager,Fragmentstatepageradapter,Fragmentmanager,在我的项目中,我使用actionbar和SwipeableThreeFragments(带viewpager的选项卡),我试图用第四个片段替换其中一个片段,但我无法得到它 **Below is my code** public class GetRideFragment extends Fragment implements ICustomDateTimeListener, SelectedLocationListener{ public GetRideFragmen
**Below is my code**
public class GetRideFragment extends Fragment implements ICustomDateTimeListener, SelectedLocationListener{
public GetRideFragment() {
}
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_getride, container, false);
return rootView;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
fromac.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/* Intent newintent = new Intent(getActivity(), AutoSearchActivity.class);
startActivity(newintent);
getActivity().overridePendingTransition( R.anim.slide_in_up, R.anim.slide_out_up );*/
PlaceSearchFragment fh = new PlaceSearchFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragcontainer, fh);
ft.addToBackStack("fh");
ft.commit();
}
});
下面是我的布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragcontainer">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/fragcontainer"
>
<TextView
android:id="@+id/ridetitile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Get a Ride"
android:layout_marginTop="20dp"
android:layout_marginLeft="10dp"
android:textColor="#33b5e5"
android:layout_gravity="center"
android:textAppearance="?android:attr/textAppearanceLarge" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="20dp"
android:layout_marginRight="5dp"
android:layout_marginLeft="5dp"
android:background="@drawable/gray_btn_disabled_normal" >
...............
...........
我不知道哪里出了问题。非常感谢您的帮助。我也遇到了同样的问题。经过多次搜索,我找到了解决方案。我会在你的代码中看到两个问题:(对不起,我的英语不好) 1) 要更改适配器(连接到您的viewpager)中给定位置的项目,您必须更改方法
public Fragment getItem(int index)
返回的项目,并调用方法notifyDataSetChanged()
通知适配器内容已更改
2) FragmentStatePagerAdapter
的实现包含一个基于位置的缓存,即使调用notifyDataSetChanged()
并返回PagerAdapter.position\u NONE
(此处报告了一个问题:)
我建议你:
- 使用
,正确执行方法FragmentPagerAdapter
(在给定位置使用正确的项)、getItem(int-index)
和getItemPosition(Object-Object)
getItemId(int-position)
我希望有帮助 问题应该在适配器中。你用的是哪一个?有错误吗???如果那样的话,展示你的logcat@carlo.marinangeli我正在使用FragmentStatePagerAdapter…用适配器更新我的问题,请看一看我在做什么@Override public Fragment getItem(int index){switch(index){case 0:if(index==0){return GetRideFragment.newInstance();}else{return PlaceSearchFragment.newInstance();}我可以在顶部看到新的片段,但旧的片段仍然保留着……每次您想更改适配器内的内容时,您能告诉我应该在哪里使用notifyDataSetChanged()吗(或者更好:每次内容更改,因此
getItem
准备返回不同的片段->替换片段),您必须调用notifyDataSetChanged()
。这样您就可以通知适配器它必须刷新。
public class TabsPagerAdapter extends FragmentStatePagerAdapter {
public TabsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
// Top Rated fragment activity
return new GetRideFragment();
case 1:
// Games fragment activity
return new PostRideFragment();
case 2:
// Movies fragment activity
return new SearchRidesFragment();
}
return null;
}
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
@Override
public int getCount() {
// get item count - equal to number of tabs
return 3;
}
}