第一个viewpager页面空白

4
我有一个与Android的ViewPager相关的问题。我目前正在尝试实现一个VerticalViewPager(虽然这与正常的ViewPager无关),使用自定义PagerAdapter从我的数据库中获取内容并将其输入到屏幕上。
问题在于,我的第一张卡片似乎是空白的,直到我将它滑动到下一页并返回后,内容才会出现。我不确定发生了什么,希望有人能解决这个问题。我在这里找到了一个类似的问题: Why is the first view in ViewPager appearing empty?Activity using ViewPager, PagerAdapter and AsyncTask causes a blank view,但似乎里面没有任何东西能够帮助我。
以下是我的自定义PagerAdapter代码:
public class BeginnerCardCursorPagerAdapter extends PagerAdapter {
    private Cursor cursor;
    private LayoutInflater inflater;

    public BeginnerCardCursorPagerAdapter(Context context, Cursor cursor){
        this.cursor = cursor;
        this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void swapCursor(Cursor cursor){
        this.cursor = cursor;
    }

    @Override
    public void destroyItem(View view, int position, Object object) {
        ((VerticalViewPager) view).removeView((RelativeLayout) object);
    }

    @Override
    public int getCount() {
        if(cursor == null) {
            return 0;
        } else {
            return 90;
        }
    }

    @Override
    public Object instantiateItem(View view, int position) {
        RelativeLayout layout = null;
        int position2 = position;
        if(position == 0){
            layout = (RelativeLayout) inflater.inflate(R.layout.activity_slide_info, null);
        }if(position == 89){
            layout = (RelativeLayout) inflater.inflate(R.layout.activity_advertisement_beginner, null);
        }
        else if(position > 0 && position < 89){
            position2--;
            cursor.moveToPosition(position2);
            layout = (RelativeLayout) inflater.inflate(R.layout.activity_card, null);
            layout.setBackgroundResource(R.drawable.card_beginner);
            TextView cardTitle = (TextView) layout.findViewById(R.id.pirate_card_title);
            TextView cardExample = (TextView) layout.findViewById(R.id.pirate_card_example);
            TextView cardDefinition = (TextView) layout.findViewById(R.id.pirate_card_definition);

            cardTitle.setText(cursor.getString(cursor.getColumnIndex(FlashCardTable.COLUMN_TITLE)));
            cardExample.setText(cursor.getString(cursor.getColumnIndex(FlashCardTable.COLUMN_SENTENCE)));
            cardDefinition.setText(cursor.getString(cursor.getColumnIndex(FlashCardTable.COLUMN_DEFINITION)));
        }
        ((VerticalViewPager) view).addView(layout);
        return layout;
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == arg1;
    }
}

从destroyitem方法中移除此行代码:((VerticalViewPager)view).removeView((RelativeLayout) object);。 - Ketan Ahir
不幸的是,没有骰子。 - user2525981
你正在使用动态高度的ViewPager吗? - Govind
2个回答

1
我在使用ViewPager和Fragment时遇到了同样的问题。第一页内的片段始终为空,而第二页及以后的页面都正常,当我从第二或第三页返回时,第一页也正常。
我发现问题的原因是在片段的onCreateView方法中加载数据,视图在数据库中的数据加载之前就已经创建好了。我将代码更改为在片段的onStart方法中加载数据,一切都正常了。
@Override
public void onStart() {
   getActivity().getLoaderManager().initLoader(LOADER_ID,null, this);
   super.onStart();
}

希望这有所帮助。

我正在使用Volley从JSON获取数据。我将调用从onCreateView转移到了MainActivity的onCreate中,但问题仍然存在。现在数据来自ArrayList。谢谢。 - MindRoasterMir

0
问题可能是因为卡片需要从数据库加载数据,而视图在数据加载后没有更新。尝试添加以下代码:
 handler.postDelayed(r=new Runnable()
        {
            @Override
            public void run() {
                if (mPosition == position)
                {

                    notifyDataSetChanged();
                   handler.removeCallbacks(r);


                }
            }
        }, 1000);

在适配器的instantiateItem方法中,延迟1秒后更新视图,以便在创建时更新视图。mPosition是正在打开的第一张卡片的位置。如果您通过单击列表中的项目来打开viewpager,则需要在调用适配器时传递所选项目的位置..否则,如果第一个项目始终最初在viewpager中打开,则可以将mPostion设置为0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接