为什么ViewPager中的第一个视图显示为空?

我有一个viewpager使用下面的适配器,加载后第一个视图显示为空,但它不是。 如果我滚动到下一个视图,然后向后滚动,我可以看到内容。

import android.content.Context; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.widget.TextView; import java.util.ArrayList; public class MyPagerAdapter extends PagerAdapter { Context context; public ArrayList<TextView> mViews; int layoutResourceId; public MyPagerAdapter(Context context) { mViews = new ArrayList<TextView>(); } @Override public void destroyItem(View view, int arg1, Object object) { ((ViewPager)view).removeView((View)object); } @Override public void finishUpdate(View arg0) { } @Override public int getCount() { return mViews.size(); } @Override public Object instantiateItem(View view, int position) { View myView = mViews.get(position); ((ViewPager)view).addView(myView); return myView; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { } @Override public int getItemPosition(Object object) { return POSITION_NONE; } } 

这里是从我的活动实现它的代码…

 public void resetPages() { if (mPageText == null) return; mPagerAdapter.mViews.clear(); for (int i = 0; i < mPageText.size(); i++) { TextView tv = new TextView(this); tv.setTextSize(mSelectedFontSize); tv.setText(mPageText.get(i)); tv.setId(i); tv.setTag(i); tv.invalidate(); mPagerAdapter.mViews.add(tv); } mPagerAdapter.notifyDataSetChanged(); mViewPager.refreshDrawableState(); } 

Solutions Collecting From Web of "为什么ViewPager中的第一个视图显示为空?"

尝试添加followind onCreate方法,我的代码工作(“TEXT 0”在启动时出现)。 也许是唯一的,因为resetPages()在不适当的时机被调用?

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPageText = new LinkedList<CharSequence>(); for (int i=0; i<10; i++) { mPageText.add("TEXT "+i); } this.mPagerAdapter = new MyPagerAdapter(this); this.mViewPager = (ViewPager)this.findViewById(R.id.viewpager); this.mViewPager.setAdapter(mPagerAdapter); resetPages(); } 

我不知道这一点,但如果您在instantiateItem中使用ViewGroup视图,那么它可能工作,我用viewgroup和它的工作正常。

 @Override public Object instantiateItem(View view, int position) { View myView = mViews.get(position); ((ViewPager)view).addView(myView); return myView; } 

希望我的回答有帮助..

这个问题必须是因为视图花费时间来加载内容,并且在内容被加载后视图不会被更新。试着添加

  handler.postDelayed(r=new Runnable() { @Override public void run() { if (mPosition == position) { notifyDataSetChanged(); handler.removeCallbacks(r); } } }, 1000); 

在适配器的内部instantiateItem ,以便在创build1秒后更新视图。 mPosition是正在打开的第一个视图的位置。如果通过单击列表中的项目打开viewpager,则需要在调用适配器时传递正在select的项目的位置。因此,您可以将mPostion设置为0如果第一个项目始终在viewpager中打开