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

Android 为什么ViewPager中的第一个视图显示为空?,android,Android,我有一个使用以下适配器的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

我有一个使用以下适配器的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;
    }

}
导入android.content.Context;
导入android.os.Parcelable;
导入android.support.v4.view.PagerAdapter;
导入android.support.v4.view.ViewPager;
导入android.view.view;
导入android.widget.TextView;
导入java.util.ArrayList;
公共类MyPagerAdapter扩展了PagerAdapter{
语境;
公共阵列视图;
国际布局资源;
公共MyPagerAdapter(上下文){
mViews=newarraylist();
}
@凌驾
公共项(视图,int arg1,对象){
((ViewPager)视图)。移除视图((视图)对象);
}
@凌驾
public void finishUpdate(视图arg0){
}
@凌驾
public int getCount(){
返回mViews.size();
}
@凌驾
公共对象实例化项(视图,int位置){
View myView=mViews.get(位置);
((ViewPager)视图).addView(myView);
返回myView;
}
@凌驾
公共布尔值isViewFromObject(视图,对象){
返回视图==对象;
}
@凌驾
公共地产(地块arg0,类加载器arg1){
}
@凌驾
公共包裹存储状态(){
返回null;
}
@凌驾
公共作废启动日期(视图arg0){
}
@凌驾
public int getItemPosition(对象){
返回位置\无;
}
}
下面是从我的活动中实现它的代码

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();
}
public void resetPages(){
如果(mPageText==null)
返回;
mPagerAdapter.mViews.clear();
对于(int i=0;i
尝试添加followind onCreate方法,我的代码正常工作(“启动时出现文本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();
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPageText=newlinkedlist();

对于(int i=0;i我不确定这一点,但如果您在实例化项中为视图使用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);

在适配器的
实例化项
内,以便在创建视图时在1秒后更新视图。
mPosition
是第一个打开的视图的位置。如果您通过单击列表中的项打开viewpager,则需要传递调用适配器时所选项的位置。否则,您可以如果第一个项目最初总是在viewpager中打开,则将
mPostion
设置为0

几分钟前我遇到了一个类似的问题


我的问题只是图像。我重新安排了幻灯片的顺序,发现特定的图像仍然是空白的。因此,只需替换图像,对我来说是有效的:)

什么是
mResizeTextView
?mResizeTextView是一个自定义的文本视图,用于计算给定空间中可以容纳多少文本。我有一个长字符串,需要跨多个页面显示。它当前仅对调试用户可见。我已从上述代码中删除了mResizeTextView行。无需更改nge它的可见性已消失..仍然存在相同的问题。我没有意识到该项目使用的是旧的支持库。我更新到v 13,直到我滚动离开它,然后再滚动回它,我仍然无法看到第一个视图。我遇到了完全相同的问题。你找到解决方案了吗?还有一些库用于为了提高速度,可以尝试使用picas/picasa/Glider来简化回答过程,而不是在评论中写额外的信息