2017-07-29 27 views
2

我只能使用ViewPager向後翻頁並且不能翻頁。我只能使用ViewPager向後翻頁並且不能向前翻頁

running image

我writint的旗幟,但我只能用ViewPager向後頁面,不能向前翻頁。

這是我寫的適配器。

class MyPagerAdapter extends PagerAdapter { 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     int p = position % mImgRes.length; 
     container.addView(mListView.get(p)); 
     return mListView.get(p); 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((View) object); 
    } 

    @Override 
    public int getCount() { 
     return 100; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return (view == object); 
    } 

} 

這是一條錯誤消息。當我向前滾動

 
    07-29 20:45:02.098 20791-20791/com.example.myfirstpro E/AndroidRuntime: 
    FATAL EXCEPTION: main 
    Process: com.example.myfirstpro, PID: 20791 
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
     at android.view.ViewGroup.addViewInner(ViewGroup.java:4465) 
     at android.view.ViewGroup.addView(ViewGroup.java:4301) 
     at android.support.v4.view.ViewPager.addView(ViewPager.java:1505) 
     at android.view.ViewGroup.addView(ViewGroup.java:4242) 
     at android.view.ViewGroup.addView(ViewGroup.java:4215) 
     at com.example.myfirstpro.MainFragment$MyPagerAdapter.instantiateItem(MainFragment.java:62) 
     at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1034) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:1216) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 
     at android.support.v4.view.ViewPager$3.run(ViewPager.java:273) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:892) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:704) 
     at android.view.Choreographer.doFrame(Choreographer.java:637) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:878) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5628) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:853) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:737) 

程序將會崩潰。

這是除了比適配器以外。@閎督安

private ViewPager mVpScroll; 
private int mImgRes[] = new int[] { 
     R.drawable.banner01, 
     R.drawable.banner02, 
     R.drawable.banner03 
}; 
private List<View> mListView = new ArrayList<>(); 
private LayoutInflater mInfalte; 

public MainFragment() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    for (int i = 0; i < mImgRes.length; i++) { 
     View inflate = inflater.inflate(R.layout.fragment_main_scroll_item, null); 
     ImageView ivBanner = (ImageView) inflate.findViewById(R.id.iv_scroll); 
     ivBanner.setImageResource(mImgRes[i]); 
     mListView.add(inflate); 
    } 
    mInfalte = inflater; 
    return inflater.inflate(R.layout.fragment_main, container, false); 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    mVpScroll = (ViewPager) view.findViewById(R.id.vp_scroll); 
    mVpScroll.setAdapter(new MyPagerAdapter()); 
} 
+0

你想使唯一正確的走一個方向? –

+0

使用'FragmentStatePagerAdapter',而不是'PagerAdapter' – matoni

+0

見我這個答案將幫助您:https://stackoverflow.com/a/45389635/5743202 –

回答

0

代碼作爲錯誤信息顯示,根本原因是孩子View添加兩次。但爲什麼只有當你向後滑動時纔會發生這種情況?我做了一個測試項目,我想我找到了原因:)

ViewPager滾動,它會利用其PagerAdapter的方法回收項目:instantiateItemdestroyItem,當ViewPager要展示一個新的項目,instantiateItem是稱爲,當ViewPager滾開時,屏幕上的視圖將被方法destroyItem破壞。

默認情況下,ViewPager將保持在每邊爲平滑滾動1更多的項目,這意味着最多有3項目保持在ViewPager

的問題是,你正在使用:

int p = position % mImgRes.length; 

實施「循環」 ViewPager,這意味着如果mImgRes.length == 3,3的位置會顯示相同的View在位置0。

現在想想你的情況:

  • ViewPager inited,該項目01(右側項目)由instantiateItem加入;

  • 然後向右滾動一個頁面中,示出1該項目,並添加2該項目時,現在的項目0(左側項),12(右側項目)保持;

  • 向右滾動一個頁面再次,該項目2所示,項3被添加時,該項目0用方法destroyItem破壞,現在該項目1(左側項),23(右側項目,與0相同的項目)被保留;

一切工作正常,如果instantiateItemdestroyItem按預期方式工作,當你向右滾動(「正向」)它的工作,但是當你向左滾動(「落後」),這是行不通的因爲當執行instantiateItemdestroyItem的順序是不同的!請參閱日誌:

07-30 22:00:04.385 26064-26064/com.example.test D/xxxxx: instantiateItem: 0 
07-30 22:00:04.388 26064-26064/com.example.test D/xxxxx: instantiateItem: 1 
07-30 22:00:17.693 26064-26064/com.example.test D/xxxxx: instantiateItem: 2 
07-30 22:00:18.743 26064-26064/com.example.test D/xxxxx: destroyItem: 0 
07-30 22:00:18.744 26064-26064/com.example.test D/xxxxx: instantiateItem: 3 
07-30 22:00:26.477 26064-26064/com.example.test D/xxxxx: instantiateItem: 0 < -- crash!!! 
07-30 22:00:18.743 26064-26064/com.example.test D/xxxxx: destroyItem: 3 

當你向右滾動,destroyItem先執行,然後instantiateItem,所以它工作正常,但是當你向左滾動,instantiateItem首先執行,打印日誌的最後一行,所以當,該項目0添加了第二次,因爲(與項目0共享相同的View)項3尚未被破壞,那麼它崩潰:)

有趣的是,如果mImgRes.length > 3,它將工作沒問題,因爲當有4件物品時,也不算太晚執行。

所以,如果你想實現ViewPager與「循環」功能,你必須考慮如何解決這個問題。

+0

非常感謝你,現在我知道它在哪裏wrong.I可以寫這樣的代碼可以是loop.'private INT mImgRes [] =新INT [] { R.drawable。 banner01, R.drawable.banner02, R.drawable.banner03, R.drawable.banner01, R.drawable.banner02, R.drawable.banner03 };' –