gpt4 book ai didi

Android Viewpager.setCurrentitem() 和 FragmentPagerAdapter instantiateItem() fragment 初始化不匹配

转载 作者:太空狗 更新时间:2023-10-29 15:01:07 29 4
gpt4 key购买 nike

我对 FragmentPagerAdapter 有问题,我通过 FragmentPagerAdapter 在 vi​​ewpager 中设置了 fragment ,我必须动态显示 viewpager,我有 listview 数据,我需要在 viewpager 中显示, 当我点击 listview 时,我必须在 viewpager 中加载确切的位置 所以我只是设置要在 FragmentPagerAdapter 中显示的项目的总大小,但问题是,当我通过 mPager.setCurrentItem(listposition) 选择 viewpager 位置时,它显示了 viewpager 的正确位置, 但是数据加载在错误的位置,它加载到 viewpager 位置的下一个 fragment 中,在 FragmentPagerAdapter 中进行一些跟踪后,我展示了 instantiateItem 方法提前初始化一个 fragment ,就像我设置 viewpager 2 的当前项(来自 ListView ) 然后 instantiateItem 方法初始化 0 到 3 个 fragment ,我认为数据加载在第 3 个 fragment 中的原因,我也尝试了很多 FragmentStatePagerAdapter 但没有任何成功,请帮助我,提前感谢。

主要 Activity 类(Fragmnetactivity):

 public class NewsDetail extends FragmentActivity implements OnClickListener {
public static ViewPager mPager;
private static int NUM_PAGES;
private PagerAdapter mPagerAdapter;
public static ArrayList<Integer> exist_detail = new ArrayList<Integer>();
public static ArrayList<PageFragment> detailfragment = new ArrayList<PageFragment>();


mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);

NUM_PAGES = topList.size();
PageFragment fragment = new PageFragment();
Bundle args = new Bundle();
args.putInt("page", i);
fragment.setArguments(args);
detailfragment.add(fragment);

mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

@Override
public void onPageSelected(int arg0) {
if (PageFragment.getInstance() != null) {
Log.d("LOG","PageFragment || "+ PageFragment.getInstance());
PageFragment.getInstance().startLoadingNews(
MusicList.topMusicList.get(arg0)._id);
}
return;
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {}

@Override
public void onPageScrollStateChanged(int arg0) {}
});
mPagerAdapter.notifyDataSetChanged();

mPager.setCurrentItem(listposition);// setcurrent item from here , it is selected from list. "listposition" indicate list position click



private class ScreenSlidePagerAdapter extends FragmentPagerAdapter {

private FragmentManager mFragmentManager;
private FragmentTransaction mCurTransaction = null;
private Fragment mCurrentPrimaryItem = null;
private static final boolean DEBUG = false;

public ScreenSlidePagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
this.mFragmentManager = fragmentManager;
}

@Override
public Fragment getItem(int position) {

return detailfragment.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return super.getItemId(position);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {

Log.v("LOG", "On InstantiateItem " + position);// it indicate that this method initialize one fragment in advance.

return super.instantiateItem(container, position);
}

public String makeFragmentName(int viewId, long index) {
return "android:switcher:" + viewId + ":" + index;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
if (DEBUG)
Log.e("LOG", "Detaching item #" + position + ": f=" + object
+ " v=" + ((Fragment) object).getView());
mCurTransaction.detach((Fragment) object);
}

@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}

@Override
public int getCount() {
return NUM_PAGES;
}
}
}

页面 fragment

       public class PageFragment extends Fragment implements OnClickListener {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPageNumber = getArguments().getInt(ARG_PAGE);
mDetailPageFragment = this;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout containing a title and body text.
rootView = (ViewGroup) inflater.inflate(R.layout.newsdetail, container,
false);
//init();
return rootView;
}
public void startLoadingNews(String _id) {

if (NetworkUtil.cheackNetwork(mActivity)) {
executeTask(_id);
} else {
showRetryCancelDialog();
}
}
}

最佳答案

我可以在您发布的代码中看到两个问题:

  1. 仅在 FragmentPagerAdapter.getItem 中实例化您的 fragment 。不要实例化它们并将它们保存到某个列表或数组中,让 FragmentPagerAdapter 为您完成。在 FragmentPagerAdapter.instantiateItem 中,它检查 Fragment 是否已经创建,如果是,则返回它,如果没有,它将调用您的 getItem 来创建 fragment 。
  2. 不要为您的 fragment 使用 Singleton 方案,使用构造函数或 .newInstance() 静态助手创建一个新 fragment 。

关于Android Viewpager.setCurrentitem() 和 FragmentPagerAdapter instantiateItem() fragment 初始化不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26687249/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com