4

我有一个与 Android 的 ViewPager 相关的问题。我目前正在尝试使用自定义 PagerAdapter 实现 VerticalViewPager(尽管这与问题无关,因为普通 ViewPager 也会出现同样的问题),该 PagerAdapter 从我的数据库中获取内容并将其输入到屏幕上。

问题是我的第一张卡片似乎是空白的,直到我将它滑到下一页并返回。之后内容就在那里。我不确定发生了什么,所以希望有人可以对这个问题有所了解。我在这里发现了一个类似的问题: 为什么 ViewPager 中的第一个视图显示为空?使用 ViewPager、PagerAdapter 和 AsyncTask 的 Activity 会导致一个空白视图 ,但似乎没有任何东西可以帮助我。

这是我的自定义 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;
    }
}
4

2 回答 2

1

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

我发现原因是我在片段的 onCreateView 方法中从数据库中加载了数据,在数据可以从数据库中加载到视图中之前创建了视图。我更改了代码以在片段的 onStart 方法中加载数据,一切都很好。

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

希望这可以帮助。

于 2018-02-08T13:48:03.497 回答
0

问题一定是因为卡需要时间从数据库加载数据并且在加载数据后视图没有更新。尝试添加

 handler.postDelayed(r=new Runnable()
        {
            @Override
            public void run() {
                if (mPosition == position)
                {

                    notifyDataSetChanged();
                   handler.removeCallbacks(r);


                }
            }
        }, 1000);

instantiateItem适配器内部,以便在创建视图时 1 秒后更新视图。mPosition是正在打开的第一张卡的位置。如果您通过单击列表中的项目打开查看器,那么您需要在调用适配器时传递正在选择的项目的位置。mPostion否则,如果您可以设置为 0第一项总是最初在 viewpager 中打开

于 2015-06-06T10:40:16.227 回答