第一个viewpager页面空白

时间:2013-08-16 03:32:02

标签: android android-viewpager android-pageradapter

我遇到与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;
    }
}

2 个答案:

答案 0 :(得分:1)

我对ViewPagers有同样的问题,我将它们与Fragments一起使用。第一页内的片段总是空的第二页,后来的页面很好,当我从第2页或第3页返回时,第一页都没问题。

我发现原因是我在数据库的onCreateView方法中加载了数据库中的数据,正在创建视图,然后才能从数据库中加载数据。我改变了我的代码,在片段的onStart方法中加载数据,一切都很好。

@Override
public void onStart() {
   getActivity().getLoaderManager().initLoader(LOADER_ID,null, this);
   super.onStart();
}

希望这有帮助。

答案 1 :(得分:0)

问题必须是因为卡正在花时间从数据库加载数据并且在加载数据后视图不会更新。尝试添加

private void applyFontToMenuItem(MenuItem mi) {
        Typeface font = Typeface.createFromAsset(getAssets(), "ds_digi_b.TTF");
        SpannableString mNewTitle = new SpannableString(mi.getTitle());
        mNewTitle.setSpan(new CustomTypefaceSpan("" , font), 0 , mNewTitle.length(),  Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        mi.setTitle(mNewTitle);
}

在适配器的navView = (NavigationView) findViewById(R.id.navView); Menu m = navView.getMenu(); for (int i=0;i<m.size();i++) { MenuItem mi = m.getItem(i); //for aapplying a font to subMenu ... SubMenu subMenu = mi.getSubMenu(); if (subMenu!=null && subMenu.size() >0 ) { for (int j=0; j <subMenu.size();j++) { MenuItem subMenuItem = subMenu.getItem(j); applyFontToMenuItem(subMenuItem); } } //the method we have create in activity applyFontToMenuItem(mi); } 内,以便视图在创建后1秒后更新。 handler.postDelayed(r=new Runnable() { @Override public void run() { if (mPosition == position) { notifyDataSetChanged(); handler.removeCallbacks(r); } } }, 1000); 是第一张正在打开的卡的位置。如果您通过单击打开viewpager列表中的项目然后您需要传递调用适配器时正在选择的项目的位置。如果第一项始终在viewpager中最初打开,则可以将instantiateItem设置为0