2013-03-13 2 views
6

ViewPager 개의 행을 포함하는 ListView이 있습니다. ViewPager이 화면에서 스크롤되면 페이지 위치를 저장하려고합니다. 사용자가 ViewPager으로 다시 스크롤하면 마지막으로 저장된 페이지 위치를 복원하려고합니다. ListView 내의 ViewPart를 재설정하지 못하도록

나는 다음 코드를 사용하여 이러한 목표를 달성하기 위해 노력하고있어 :

public class MyBaseAdapter extends BaseAdapter { 

    // Row ids that will come from server-side, uniquely identifies each 
    // ViewPager 
    private List<String> mIds = new ArrayList<String>(); 
    private Map<String, Integer> mPagerPositions = new HashMap<String, Integer>(); 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     String id = mIds.get(position); 

     View rootView = convertView; 
     if (rootView == null) { 
      rootView = LayoutInflater.from(parent.getContext()).inflate(
        R.layout.row, null); 
     } 

     ViewPager viewPager = (ViewPager) rootView.findViewById(R.id.pager); 
     Integer pagerPosition = mPagerPositions.get(id); 
     if (pagerPosition != null) { 
      viewPager.setCurrentItem(pagerPosition); 
     } 
     viewPager.setOnPageChangeListener(new MyPageChangeListener(id)); 

     return rootView; 
    } 

    @Override 
    public int getCount() { 
     return mIds.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    private class MyPageChangeListener extends 
      ViewPager.SimpleOnPageChangeListener { 

     private String mId; 

     public MyPageChangeListener(String id) { 
      mId = id; 
     } 

     @Override 
     public void onPageSelected(int position) { 
      mPagerPositions.put(mId, position); 
     } 
    } 
} 

페이지 위치는 setPagerPosition()의 첫 번째 호출에 저장됩니다. 그 다음에 ViewPager이 화면을 벗어나면 ViewPager이 여전히 표시 될 때 발생한 이전의 onPageSelected() 호출을 덮어 쓰면서 저장된 첫 번째 페이지 위치와 함께 onPageSelected()이 호출됩니다.

어떻게해야할까요?

+0

'ids' 목록이란 무엇입니까? – Luksprog

+0

ListView에서 서버 측에서 가져온 행의 id입니다. – Simian

+0

@Simian,'setCurrentItem'을 호출하기 전에'setOnPageChangeListener'를 호출 해보십시오. –

답변

3

해결 방법은 ViewPager가 보이지 않을 때 호출기 위치를 덮어 쓰지 않는 것입니다. ViewView를 스크롤 할 때 ViewPager가 화면에서 사라지면 onPageSelected가 호출되는 Android에 버그가있는 것 같습니다.

@Override 
public void onPageSelected(int position) { 
    if (viewPager.isShown()) { 
     mTopicPositions.put(mId, position); 
    } 
} 
0

현재 표시 위치를 indexOfChild(viewPager.getFocusedChild())까지 가져 와서 공유 환경 설정에 저장할 수 있으며 필요할 때마다 검색 할 수 있다고 생각합니다. 희망이 있습니다

+0

ListView에서 ViewPager가 다시 보일 때 위치를 가져와야합니다. 즉, 사용자가 ViewPager로 다시 스크롤 할 때. SharedPreferences에 저장하면 잔인합니다. 그리고 View를 저장하면 ListView의 뷰 재사용을 막을 수 있습니다. – Simian

+0

뷰를 저장할 필요가 없습니다. 포지션을 저장하기 만하면됩니다. 전역 다차원 정수 배열'intPosition [ListViewPosition] [ViewPagerPosition]'을 얻으십시오. 값을 값에 저장하고 값에 따라 뷰를 표시하십시오. –

+0

@Simian 사용하셨습니까? 모든 + ve 결과? –

관련 문제