2012-06-12 3 views
5

ViewPers 목록을 구현하고 싶습니다. ListView의 모든 항목은 ViewPager입니다. 이것은 지금까지 작동합니다. 내 문제는 ViewPager의 상태를 유지할 수 없다는 것입니다. 예를 들어 목록의 첫 번째 ViewPager 페이지를 변경할 때 첫 번째 ViewPager가 더 이상 표시되지 않을 때까지 아래로 스크롤 한 다음 다시 위로 스크롤하면 첫 번째 ViewPager에 첫 번째 페이지가 다시 표시됩니다.ListView에서 ViewPager의 상태를 유지하는 방법은 무엇입니까?

두 개의 어댑터를 작성했습니다. 하나는 ListView 용이고 다른 하나는 ViewPager 용입니다. ListView에서 getView 메서드의 convertView 매개 변수에서 뷰를 재활용하려고합니다. ViewPagerAdapter에서 어떻게하는지 잘 모르겠다.

아이디어가 있으십니까? MyListAdapter에서

의 getView : ViewPagerAdapter에서

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if(convertView == null){ 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mRowView = inflater.inflate(R.layout.listitem, parent, false); 

    }else{ 
     mRowView=convertView; 
    } 
    switch(position){ 
    case 0://Fussball 
     ViewPagerAdapter fussballAdapter = new ViewPagerAdapter(mContext,"Fussball"); 
     ViewPager fussballPager = (ViewPager) mRowView.findViewById(R.id.viewpager1); 
     fussballPager.setAdapter(fussballAdapter); 
    break; 
    case 1://Handball 
    ViewPagerAdapter handballAdapter = new ViewPagerAdapter(mContext,"Handball"); 
     ViewPager handballPager = (ViewPager) mRowView.findViewById(R.id.viewpager1); 
     handballPager.setAdapter(handballAdapter); 
     break; 
    //.../ 
    default: 
     //Do nothing 
    } 
    return mRowView; 
} 

instantiateItem :

@Override 
public Object instantiateItem(View pager, int position) { 
    inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    switch(position){ 
    case 0: 
     oneLayout=inflater.inflate(R.layout.table_layout, null); 
     break; 
    case 1: 
     oneLayout=inflater.inflate(R.layout.table_layout_second, null); 
     break; 
    default: 
     oneLayout=inflater.inflate(R.layout.table_layout, null); 
     break; 
    } 
    ((ViewPager)pager).addView(oneLayout, 0); 
    return oneLayout; 
} 

감사

여기에 지금까지 내 코드입니다! :)

답변

1

이 문제의 원인으로 ListView Recycling에 감사 할 수 있습니다. 리사이클 러가 행 항목을 회수하여 재사용하는 것을 도와줍니다.

문제를 해결하는 쉬운 방법은 태그를 사용하는 것입니다. rowView를 반환하기 전에 태그를 설정하십시오.

view.setTag(currentPagerPosition); 

그런 경우 convertView! = 당신이

int pastPagerPosition = (int) view.getTag(); 
+0

페이저가 움직일 때 현재 위치를 찾으셔야합니다.) 첫 페이지에서 다음 페이지로 이동 하시겠습니까? –

+0

ViewPagerAdapter에는 getPosition() 함수 또는 이와 비슷한 것이 있어야합니다. –

+0

감사합니다, Frank. 이미 비슷한 솔루션에 대해 생각했지만 내 문제는 MyListViewAdapter 내부에서 현재 ViewPager 위치를 얻는 것입니다. 그것을해야 getCurrentItem()라는 메서드가 있지만, 나는 항상 "0"돌아옵니다. (필자는 getView 메소드 내 ViewPager 객체에서이 객체를 사용합니다.) – kiberNet

4

구현 setOnPageChangeListener을 할 수 있으며, 당신은 여기에 현재 위치를 가져옵니다

pager = (ViewPager) findViewById(R.id.pager); 
    pager.setAdapter(new ImagePagerAdapter(imageUrls)); 
    pager.setCurrentItem(position); 

    pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     public void onPageScrollStateChanged(int arg0) { 
      // TODO Auto-generated method stub 
      int i = 0; 
      int newpos = arg0; 

     } 


     public void onPageScrolled(int arg0, float arg1, int arg2) { 
      // TODO Auto-generated method stub 
      int i = 0; 
      int newpos = arg0; 

     } 

     public void onPageSelected(int arg0) { 
      // TODO Auto-generated method stub 
      int i = 0; 
      position = arg0; 
      //you can get Current position here    
     } 
    }); 

희망을 onpageselected 수 있도록 위치를 설정해야합니다 알고 널 (null) 이 도움!

+0

ViewPager의 현재 위치를 얻는 것은 이런 식으로 작동합니다. 감사합니다. – kiberNet

+0

친절하게 답변을 kiberNet으로 표시 –

관련 문제