閱讀229 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android ViewPager實現上一頁下一頁左右滑動的正確方法

回顧一下這個功能的應用場景:有一個裝有很多條數據的一個list,這個list在listView中顯示出來了,現在滑動listView隨便到一個位置,點擊一個item進入數據的詳情頁,在這個詳情頁,我們用到了viewPager,讓它實現左右滑動的效果。

以前我也是在網上找的DEMO,大家通常的做法是,一進入詳情頁,就把每個頁麵的view初始化出來,然後把這些view放在list裏麵,傳給自己定義的viewPagerAdapter,這樣就出現滑動效果了。但是這樣就會出現一個問題,就是我的list太大,初始化出來的view頁麵就會很多,比如說1000條數據,不可能全初始化出view來放list裏再傳給adapter吧,這樣八成OOM的,於是我就照著這個思路,先初始化一部分view,再不斷的滑動過程中,再初始化一部分,但是如果你是從數據列表的中間進入,向前滑動時不斷的初始化view添加進list,這樣viewPagerAdapter的大小就會發生變化,你的currentIndex就在不斷的變化。超級不好控製。

再回想一下我們平時做一些常見的adapter的做法,沒有在activity中把所有的item初始化出來,再傳給adapter,讓adapter做顯示吧,常用的做法是,在adapter裏再進行數據的封裝什麼的,在adapter中的getView()中進行操作,無論是自定義界麵,還是填充數據。其實,viewPager的PagerAdapter也是同樣的思路。回想一下,其實就是基本的adapter的操作了,以前剛學習這個控件的時候被網上別人的demo誤導了。

public class DemoAdapter extends PagerAdapter {
  private Context context;
  private ArrayList list;
  private LayoutInflater inflater;
  public DemoAdapter (Context context, ArrayList list) {
    this.list = list;
    this.context = context;
  }
  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager) container).removeView((View) object);
  }
    inflater = LayoutInflater.from(context);
  @Override
  public void finishUpdate(View container) {}
  @Override
  public int getCount() {
    return list != null ? list.size() : 0;
  }
  @Override
  public Object instantiateItem(ViewGroup view, int position) {
    UserBean bean = list.get(position);
    //自定義的view
    View userLayout = inflater.inflate(R.layout.show_user_detail, view, false);
    ImageView ivPhoto = (ImageView) userLayout.findViewById(R.id.user_photo);
    TextView tvName = (TextView) userLayout.findViewById(R.id.user_name);
    //填充數據 
    tvName.setText(bean.getUserName);
    ((ViewPager) view).addView(userLayout, 0);
    return userLayout;
  }
  @Override
  public boolean isViewFromObject(View view, Object object) {
    return view.equals(object);
  }
  @Override
  public void restoreState(Parcelable state, ClassLoader loader) {}
  @Override
  public Parcelable saveState() {
    return null;
  }
  @Override
  public void startUpdate(View container) {}
}


看完上麵這段代碼是不是很簡單,還要注意一點就是,你在外麵的listView從哪兒跳進viewPager的時候,要在viewPager設置完adapter的時候setCurretntIndex一下,就像下麵這樣:

1
viewPager.setCurrentItem(intoPosition)

最後更新:2017-04-03 12:55:26

  上一篇:go WIKIOI-1264 芳香數
  下一篇:go C# WinForm中PreviewKeyDown、KeyDown、KeyPress、KeyUp區別與聯係