ViewPager中显示的第一个片段是我创建的第二个片段

时间:2015-05-30 11:28:50

标签: android android-fragments android-viewpager

我有对象列表提供和他们的数据我尝试填充片段(每个片段一个对象)。它以它显示它们的方式工作,但显示的第一个实际上是第二个,然后我向左滑动两次并返回到第一个然后它就在那里(第一个)

我知道这个问题与这个问题有关

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

}

1 个答案:

答案 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());