2013-03-13 5 views
6

ViewPagerの行を含むListViewがあります。 ViewPagerが画面からスクロールされると、そのページの位置を保存します。ユーザーがViewPagerに再度スクロールすると、最後に保存されたページの位置を復元します。リストビュー内のViewPaperをリセットしないでください

私は、次のコードでこれを実現しようとしている:

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がオフスクリーンになると、保存された最初のページ位置でonPageSelected()が呼び出され、ViewPagerが引き続き表示されたときに発生した以前のonPageSelected()呼び出しを上書きします。

これは正しい方法はありますか?

+0

「ids」リストとは何ですか? – Luksprog

+0

ListView内のサーバー側から来る行のID。 – Simian

+0

@Simian、 'setCurrentItem'を呼び出す前に' setOnPageChangeListener'を呼び出そうとしています –

答えて

3

解決策は、ViewPagerが表示されていないときにポケットベルの位置を上書きしないことでした。 Androidには、ListViewをスクロールするときにViewPagerが画面から消えるときにonPageSelectedが呼び出されるバグがあるようです。

@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の結果は何ですか? –

関連する問題