首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android: FragmentPagerAdapter: getItem方法第一次调用两次

Android: FragmentPagerAdapter: getItem方法第一次调用两次
EN

Stack Overflow用户
提问于 2013-03-05 16:20:45
回答 5查看 17K关注 0票数 25

在我的应用程序中,我使用了ViewPager。喜欢,

代码语言:javascript
复制
(say main.xml)

<android.support.v4.view.ViewPager
     android:id="@+id/viewPager"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:layout_above="@+id/register_header" />

并在FragmentActivity中创建ViewPager对象和ViewPagerAdapter(扩展FragmentPagerAdapter)对象。

代码语言:javascript
复制
_mViewPager = (ViewPager) findViewById(R.id.viewPager);

_adapter = new ViewPagerAdapter(getApplicationContext(),
         getSupportFragmentManager());

_mViewPager.setAdapter(_adapter);

Adapter类是这样的:

代码语言:javascript
复制
public class ViewPagerAdapter extends FragmentPagerAdapter {
    private Context _context;
    private FragmentManager manager;
    private Fragment f;
    private String classname="ViewPagerAdapter";
    public ViewPagerAdapter(Context context, FragmentManager fm) {
        super(fm);  
        _context=context;
        manager=fm;
        }
    @Override
    public Fragment getItem(int position) {
        Log.i(classname,"getItem called"+position);
        f = new Fragment();
        f=MyFragment.newInstance();
        Bundle args = new Bundle();
        args.putInt("position", position);
        f.setArguments(args);
        return f;
    }

    @Override
    public int getCount() {
        return User.getPageCount();
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}

在MyFragment类中,

在onResume中,我必须将wigets对象存储到公共静态变量中。

代码语言:javascript
复制
public void onResume() {
        super.onResume();
        pageIndex = getArguments().getInt("position");      
        User.useTextview1=textview1;
        User.useTextview2= textview2;
        User.current_pageIndex=pageIndex;



    }

我必须更新从FragmentActivity中的User类获得的文本视图。我的问题是getItem()方法在第一次时被调用了两次实际上,模拟器中显示的视图是第0个索引,但在FragmentActivity中却获得了第1个索引值。如果我第二次停止调用getItem()方法,我可以在FragmentActivity中获得第0个索引TextView引用。

请给我提供做这件事的最佳方法。

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-05 16:32:25

FragmentPagerAdapter在开始时实例化2个Fragments,用于索引0和索引1。如果您想要从屏幕上的Fragment获取数据,您可以对Pager使用setOnPageChangeListener来获取当前位置。然后对您的片段使用带有WeakReferenceSparseArray。在getItem调用中更新该数组。当调用onPageSelected时,使用该位置获取对正确Fragment的引用并更新User数据。

数组初始化:

代码语言:javascript
复制
private SparseArray<WeakReference<MyFragment>> mFragments = new SparseArray<WeakReference<MyFragment>>(3);
票数 18
EN

Stack Overflow用户

发布于 2014-04-22 13:53:09

在getItem方法中,我写道..

代码语言:javascript
复制
@Override
public Fragment getItem(int index) {
    EditFragment frag = new EditFragment();
    Bundle args = new Bundle();
    args.putSerializable("currentItem", itemsList.get(index));
    frag.setArguments(args);
    return (frag);
}

这里的索引(itemsList.get)是我将在EditFragment类中使用的模型类对象。这就是它。

代码语言:javascript
复制
 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    View result = inflater.inflate(R.layout.pager_fragment_layout, container, false);
    image = (ImageView)result.findViewById(R.id.pager_image);
    text = (TextView)result.findViewById(R.id.pager_item_desc);
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getActivity()).build();
    ImageLoader.getInstance().init(config);
    imLoader = ImageLoader.getInstance();

            ****NOTE
    final SwapItems itemList = (SwapItems) getArguments().getSerializable("currentItem");

    imagePath = itemList.getPaths().get(0);
    imLoader.displayImage(imagePath,image);
    text.setText(itemList.getItemDescription());

    image.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Fragment fragment = new ItemImagesFragment();
            FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            Bundle bundle = new Bundle();
            bundle.putSerializable("val", itemList);
            fragment.setArguments(bundle);
            fragmentTransaction.replace(R.id.content_frame, fragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    });
    return result;
}

注意:这里我从之前的getItem方法中得到了swapitems模型对象是'final‘。这解决了我的问题。早些时候,我用static作为修饰符初始化了同一个对象。

希望你的也会明白

票数 2
EN

Stack Overflow用户

发布于 2014-04-21 10:06:59

我的问题是getItem()方法第一次被调用了两次

这不是问题所在,这是default feature of FragmentPagerAdapter。从这一页滑动到下一页和上一页对你有好处。

在仿真器中显示的视图是第0个索引,但在FragmentActivity中获得了第1个索引值

我也有同样的问题,我知道为什么。这是因为你used same Fragment in View Pager

如何解决这个问题是separate Fragments by using different Fragment

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15218904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档