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

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

(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中创buildViewPager对象和ViewPagerAdapter(它扩展了FragmentPagerAdapter)对象。

 _mViewPager = (ViewPager) findViewById(R.id.viewPager); _adapter = new ViewPagerAdapter(getApplicationContext(), getSupportFragmentManager()); _mViewPager.setAdapter(_adapter); 

而Adapter类就像,

 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对象存储到常用的静态variables中。

 public void onResume() { super.onResume(); pageIndex = getArguments().getInt("position"); User.useTextview1=textview1; User.useTextview2= textview2; User.current_pageIndex=pageIndex; } 

我必须更新从FragmentActivity中的User类获得的textviews。 我的问题是第一次调用getItem()方法第一次在Fact中,模拟器中显示的视图是第0个索引,但在FragmentActivity中获得第1个索引值。 如果我第二次停止调用getItem()方法,则可以在FragmentActivity中获得第0个索引TextView引用。

请给我提供最好的方法来做到这一点。

谢谢

Solutions Collecting From Web of "Android:FragmentPagerAdapter:第一次调用两次的getItem方法"

Fragments在开始时为索引0和索引1实例化2个Fragments 。如果你想从屏幕上的Fragment获取数据,你可以使用setOnPageChangeListener来为Pager获取当前位置。 然后用WeakReferenceSparseArray分配给你的分片。 在getItem调用中更新该数组。 当onPageSelected被调用时,使用该位置来获得对右侧Fragment引用并更新User数据。

数组初始化:

 private SparseArray<WeakReference<MyFragment>> mFragments = new SparseArray<WeakReference<MyFragment>>(3); 

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

这不是问题,这是default feature of FragmentPagerAdapter 。 这对你从这个页面刷到下一个和上一个好。

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

我得到了同样的问题,我知道为什么。 这是因为您used same Fragment in View Pager

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

在getItem方法我写这个..

 @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(index)是我将在EditFragment类中使用的模型类对象。 这是那个。

  @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模型对象是'最后'。 这解决了我的问题。 早些时候,我用静态修饰符初始化了同一个对象。

希望你们也清楚

你可以使用这个方法来更新你的视图

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // Fetch data or something... } } 

我面临同样的问题 – getItem()方法被调用两次。 我不知道你使用这种方法的目的是在新的幻灯片出现时触发托pipe活​​动的变化。

那么,首先getItem()是不是一个正确的方法来获得新的幻灯片的事件。

为此,我在ViewPager本身上使用了ViewPager.OnPageChangeListener监听器。 这是我做的:

在保存幻灯片片段的Activity中:

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.signature_wizard_activity); // Instantiate a ViewPager and a PagerAdapter. mPager = (ViewPager) findViewById(R.id.pager); mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { onSlideChanged(position); // change color of the dots } @Override public void onPageSelected(int position) {} @Override public void onPageScrollStateChanged(int state) {} }); } 

每次出现幻灯片时都会调用onPageScrolled(),作为参数获取显示的幻灯片的当前位置。 好的是,它被称为包括第一次出现,而不仅仅是当幻灯片被改变。

什么时候可以使用? 例如,如果您使用ViewPager进行一些向导活动,并在其中使用一些提示来滑动片段,则可能会希望在滑块下面有一个带有灰点的条,这些条代表幻灯片的总数,其中一个点会有所不同代表当前幻灯片的颜色。 在这种情况下ViewPager.OnPageChangeListener和方法onPageScrolled()将是最好的select。

或者如果你有buttonPREV。 和NEXT改变幻灯片,你想禁用PREV。 button,并在最后一张幻灯片上禁用“下一步”button。 下面是你在onPageScrolled()方法里面的做法:

  @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(position == 0){ prevBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_grey_500)); prevBtn.setEnabled(false); }else{ prevBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_blue)); prevBtn.setEnabled(true); } if(position == NUM_PAGES -1){ nextBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_grey_500)); nextBtn.setEnabled(false); }else{ nextBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_blue)); nextBtn.setEnabled(true); } } 

其中NUM_PAGES是包含幻灯片总数的常量