2013-09-23 91 views
2

我有一個要求,顯示一個ViewPager最初只顯示一個視圖。 一旦此視圖通過度量&佈局傳遞,根據這些我可能需要更改適配器的內容的結果。 雖然這樣做,但我遇到過一種情況,即ViewPager在試圖從某個位置滑動到下一個項目時不會跟隨它的移動。
我相信我在我的適配器實現中做錯了事,但我無法指出我的手指在這個問題上。從instantiateItem()調用notifyDataSetChanged()

爲了演示的目的,我創建了一個虛擬適配器,它將模仿我實際項目中發生的事情。 爲了重現問題,試着一直滑動到位置2(第三項),結果是你無法通過位置1(第二項)。

謝謝!

public class CustomAdapter extends PagerAdapter { 
    int pages = 0; 

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

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

    public void setPages(int x) { 
     this.pages = x; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     TextView tv = new TextView(MainActivity.this); 
     ViewGroup.LayoutParams lp = 
       new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
         ViewGroup.LayoutParams.WRAP_CONTENT); 

     tv.setLayoutParams(lp); 
     tv.setText("Position: " + position); 

     if (position == 0 && pages == 1) { 
      setPages(2); 
      notifyDataSetChanged(); 
     } 
     if (position == 1 && pages == 2) { 
      setPages(3); 
      notifyDataSetChanged(); 
     } 

     container.addView(tv); 
     return tv; 
    } 

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

活動(的onCreate左右):

CustomAdapter adapter = new CustomAdapter(); 
    adapter.setPages(1); 
    vp.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 

回答

2

instantiateItem項目的方法是錯誤的地方這樣做。因爲它只能在一個視圖上同時工作3個視圖。

嘗試 setPrimaryItem方法移動

if (position == 0 && pages == 1) { 
     setPages(2); 
     notifyDataSetChanged(); 
    } 
    if (position == 1 && pages == 2) { 
     setPages(3); 
     notifyDataSetChanged(); 
    } 

UPDATE:

嘗試調用你的setPrimaryItem方法所需位置instantiateItem方法。你可以這樣做,因爲instantiateItem是一個public方法。但我不知道它是如何工作的,這是一個理論。試試吧。

+0

instantiateItem方法不能再次調用如何解決此問題? –

相關問題