我有对象列表提供和他们的数据我尝试填充片段(每个片段一个对象)。它以它显示它们的方式工作,但显示的第一个实际上是第二个,然后我向左滑动两次并返回到第一个然后它就在那里(第一个)
我知道这个问题与这个问题有关
ViewPager first fragment shown is always wrong with FragmentStatePager
但问题是自我回答而且不太容易理解,所以我真的需要帮助
这是我的代码: 内部片段活动
public class OffersDisplay extends FragmentActivity {
/*some inicializations for layout and stuff*/
listOfOffers = (ArrayList<Offer>) getIntent().getSerializableExtra("listOfOffers");
...
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int getCount() {
return ITEMS;
}
@Override
public Fragment getItem(int position) {
return ImageFragment.init(listOfOffers.get(position));
}
}
}
我的 ImageFragment 类是单独的,看起来像这样
public class ImageFragment extends Fragment {
//some inits again
public static ImageFragment init(Offer offer) {
// Supply val input as an argument.
name = offer.getName();
description = offer.getDescription();
moreInfoURL = offer.getMoreInfoURL();
return new ImageFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
layoutView = inflater.inflate(R.layout.fragment_image, container,
false);
tv = layoutView.findViewById(R.id.text);
((TextView) tv).setText(name + "\n"+ description);
iview = layoutView.findViewById(R.id.image);
//...some inits
((ImageView) iview).setImageBitmap(pic);
return layoutView ;
}
}
答案 0 :(得分:1)
我已经解决了这个问题。之所以破坏是因为某些原因(我不清楚)你不能初始化片段所需的值(例如你的ImageFRagment),它的初始化或工厂方法,并期望稍后使用它创建视图以保持订单到位。您必须通过参数(bundle)将值作为参数提供给片段。因此,如果适配器在启动寻呼机时有4页内容为A,B,C,D,则会为元素[0]调用onCreateView和onCreate,即。 A.在我的情况下,我总是得到B,B,C,D并向后滑动D,C,B,A。
以便修复您的代码 `public static ImageFragment init(Offer offer){
ImageFragment fragment = new ImageFragment();
Bundle args = new Bundle();
String name = offer.getName();
String description = offer.getDescription();
args.putString(ARG_NAME, name);
args.putString(ARG_CONTENT, description);
fragment.setArguments(args);
return fragment; }
然后在onCreate()上,您必须使用参数初始化视图所需的值:
mName = getArguments().getInt(ARG_NAME);
content = getArguments().getString(ARG_CONTENT);
在onCreateView()中,您可以使用辅助函数访问这些值以检索它们。
((TextView) rootView.findViewById(android.R.id.text1)).setText(getContent());
((TextView) rootView.findViewById(R.id.article_content)).setText(getPageNumber());