在我的应用程序中,我使用了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中创建ViewPager对象和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对象存储到公共静态变量中。
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引用。
请给我提供做这件事的最佳方法。
谢谢
发布于 2013-03-05 16:32:25
FragmentPagerAdapter
在开始时实例化2个Fragments
,用于索引0和索引1。如果您想要从屏幕上的Fragment
获取数据,您可以对Pager
使用setOnPageChangeListener
来获取当前位置。然后对您的片段使用带有WeakReference
的SparseArray
。在getItem
调用中更新该数组。当调用onPageSelected
时,使用该位置获取对正确Fragment
的引用并更新User
数据。
数组初始化:
private SparseArray<WeakReference<MyFragment>> mFragments = new SparseArray<WeakReference<MyFragment>>(3);
发布于 2014-04-22 13:53:09
在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)是我将在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模型对象是'final‘。这解决了我的问题。早些时候,我用static作为修饰符初始化了同一个对象。
希望你的也会明白
发布于 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
。
https://stackoverflow.com/questions/15218904
复制相似问题